Repository: wenghengcong/Coderpursue Branch: master Commit: f4693d0ca8d6 Files: 1889 Total size: 43.3 MB Directory structure: gitextract_4gg4ea93/ ├── .gitignore ├── BeeFun/ │ ├── .swiftlint.yml │ ├── BeeFun/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Github/ │ │ │ │ ├── Contents.json │ │ │ │ ├── git_fork.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── git_star.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── git_starred.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Logo/ │ │ │ │ ├── Contents.json │ │ │ │ ├── app_logo_90.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── github_signin_logo.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── login_tip.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Octicon_15/ │ │ │ │ ├── Contents.json │ │ │ │ ├── octicon_comment_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_fork_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_person_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_repo_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_star_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_state_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_time_15.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── octicons_code_15.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Octicon_20/ │ │ │ │ ├── Contents.json │ │ │ │ ├── octicon_filesize_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_fork_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_issue_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_language_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_private_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_star_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_watch_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── octicons_code_20.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Octicon_25/ │ │ │ │ ├── Contents.json │ │ │ │ ├── coticon_branch_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── coticon_home_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── coticon_repository_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── coticon_tag_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_commit_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_issue_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_loc_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_org_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_person_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_pull_request_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_push_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_time_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── octicons_code_25.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Octicon_35/ │ │ │ │ ├── Contents.json │ │ │ │ └── octicon_star_35.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Octicon_Red/ │ │ │ │ ├── Contents.json │ │ │ │ ├── octicon_fork_red_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_fork_red_25.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_star_red_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── octicon_watch_red_20.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── octicon_watch_red_25.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── ReposDetail/ │ │ │ │ ├── Contents.json │ │ │ │ ├── repos_file.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_fork.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_homepage.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_issue.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_lan.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_lock.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_me.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_star.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── repos_unlock.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── repos_watch.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Tag/ │ │ │ │ ├── Contents.json │ │ │ │ ├── set_tag_black.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── tag_pop.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── tags_add.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── UserDetail/ │ │ │ │ ├── Contents.json │ │ │ │ ├── user_home.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── user_loc.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── user_org.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── user_time.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── arrow/ │ │ │ │ ├── Contents.json │ │ │ │ ├── arrow_down.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_down_gray.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_left.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_left_gray.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_right.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_right_gray.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── arrow_up.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── arrow_up_gray.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── bar_icon/ │ │ │ │ ├── Contents.json │ │ │ │ ├── nav_cancel.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── nav_funnel.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── nav_funnel_sel.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── nav_seg_nor.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── nav_seg_sel.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── nav_share.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── network/ │ │ │ │ ├── Contents.json │ │ │ │ ├── empty_data.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── network_error_1.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── network_error_2.imageset/ │ │ │ │ └── Contents.json │ │ │ └── octocat/ │ │ │ ├── Contents.json │ │ │ └── benevocats.imageset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── LaunchScreen.storyboard │ │ ├── BeeFun-Bridging-Header.h │ │ ├── BeeFun.entitlements │ │ ├── Info.plist │ │ ├── Model/ │ │ │ ├── BeeFunModel/ │ │ │ │ ├── BeeFunResponseModel.swift │ │ │ │ ├── BeeFunTrendingResponseModel.swift │ │ │ │ ├── GetAllTagResponse.swift │ │ │ │ ├── GetReposResponse.swift │ │ │ │ └── ObjTag.swift │ │ │ ├── DataModel.swift │ │ │ ├── Event/ │ │ │ │ ├── ObjAsset.swift │ │ │ │ ├── ObjBranch.swift │ │ │ │ ├── ObjComment.swift │ │ │ │ ├── ObjCommit.swift │ │ │ │ ├── ObjDeployment.swift │ │ │ │ ├── ObjDeploymentPayload.swift │ │ │ │ ├── ObjEvent.swift │ │ │ │ ├── ObjEventPayload.swift │ │ │ │ ├── ObjHref.swift │ │ │ │ ├── ObjLinks.swift │ │ │ │ ├── ObjMember.swift │ │ │ │ ├── ObjNotification.swift │ │ │ │ ├── ObjPage.swift │ │ │ │ ├── ObjPullRequest.swift │ │ │ │ ├── ObjRelease.swift │ │ │ │ ├── ObjSearchCode.swift │ │ │ │ └── ObjSubject.swift │ │ │ ├── Issue/ │ │ │ │ ├── ObjIssue.swift │ │ │ │ ├── ObjLabel.swift │ │ │ │ └── ObjMilestone.swift │ │ │ ├── Network/ │ │ │ │ ├── AppToken.swift │ │ │ │ ├── NetFilter.swift │ │ │ │ ├── ObjErropReponse.swift │ │ │ │ ├── ObjError.swift │ │ │ │ ├── ObjResponseHeader.swift │ │ │ │ └── ObjResponser.swift │ │ │ ├── ObjBase.swift │ │ │ ├── Other/ │ │ │ │ └── ObjSettings.swift │ │ │ ├── Repos/ │ │ │ │ ├── ObjGithubStarRepos.swift │ │ │ │ ├── ObjRepos.swift │ │ │ │ └── ObjReposSum.swift │ │ │ ├── Trending/ │ │ │ │ └── ObjShowcase.swift │ │ │ └── User/ │ │ │ ├── ObjEmail.swift │ │ │ ├── ObjPermissions.swift │ │ │ ├── ObjPlan.swift │ │ │ ├── ObjUser.swift │ │ │ └── ObjUserSum.swift │ │ ├── Resources/ │ │ │ ├── Localizable/ │ │ │ │ ├── en.lproj/ │ │ │ │ │ └── Localizable.strings │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ └── Localizable.strings │ │ │ ├── cert/ │ │ │ │ └── beefuntop.p12 │ │ │ └── plist/ │ │ │ ├── en.lproj/ │ │ │ │ ├── BFLanguage.plist │ │ │ │ ├── BFPopularLanguage.plist │ │ │ │ ├── BFSetting.plist │ │ │ │ ├── CPCity.plist │ │ │ │ ├── CPCountry.plist │ │ │ │ └── CPFilterLanguage.plist │ │ │ └── zh-Hans.lproj/ │ │ │ ├── BFLanguage.plist │ │ │ ├── BFPopularLanguage.plist │ │ │ ├── BFSetting.plist │ │ │ ├── CPCity.plist │ │ │ ├── CPCountry.plist │ │ │ └── CPFilterLanguage.plist │ │ ├── SystemManager/ │ │ │ ├── Manager/ │ │ │ │ ├── Oauth/ │ │ │ │ │ ├── OAuthGithubWebController.swift │ │ │ │ │ └── OAuthManager.swift │ │ │ │ ├── Push/ │ │ │ │ │ ├── BFMessageManager.swift │ │ │ │ │ └── JPushManager.swift │ │ │ │ ├── ThirdParty/ │ │ │ │ │ ├── AnswerManager.swift │ │ │ │ │ ├── KPIManager.swift │ │ │ │ │ ├── PayManager.swift │ │ │ │ │ ├── PurchaseManager.swift │ │ │ │ │ └── ShareManager.swift │ │ │ │ ├── Utils/ │ │ │ │ │ ├── BFFeedbackManager.swift │ │ │ │ │ ├── BFGlobalHelper.swift │ │ │ │ │ ├── BFLanunchManager.swift │ │ │ │ │ ├── BFMonitor+Handle.swift │ │ │ │ │ ├── BFMonitor.swift │ │ │ │ │ ├── BFTabbarManager.swift │ │ │ │ │ ├── BFTimeHelper.swift │ │ │ │ │ ├── JumpManager.swift │ │ │ │ │ ├── PlistHelper.swift │ │ │ │ │ └── UserManager.swift │ │ │ │ ├── View/ │ │ │ │ │ ├── MJRefreshManager.swift │ │ │ │ │ └── YYTextManager.swift │ │ │ │ └── iCloud/ │ │ │ │ ├── BFPathManager.swift │ │ │ │ └── BFZipManager.swift │ │ │ ├── Network/ │ │ │ │ ├── BFNetworkManager.swift │ │ │ │ ├── BFStatusCode.swift │ │ │ │ ├── BeeFunAPI.swift │ │ │ │ ├── BeeFunDBManager.swift │ │ │ │ ├── EventAPI.swift │ │ │ │ ├── GitHubAPI.swift │ │ │ │ ├── IdentityAndTrust.swift │ │ │ │ ├── IssueAPI.swift │ │ │ │ ├── LanguageManager.swift │ │ │ │ ├── Response+ObjectMapper.swift │ │ │ │ ├── SVGProcessor.swift │ │ │ │ ├── SearchAPI.swift │ │ │ │ └── TrendingManager.swift │ │ │ ├── ProConfig/ │ │ │ │ ├── BFCommonString.swift │ │ │ │ ├── BFNotificationName.swift │ │ │ │ ├── BFPlistResourcesKey.swift │ │ │ │ ├── BFStyleGuide.swift │ │ │ │ ├── BFThirdLibKey.swift │ │ │ │ ├── BFUserDefaultManager.swift │ │ │ │ ├── UIColor+Project.swift │ │ │ │ └── UIFont+Project.swift │ │ │ └── Storage/ │ │ │ ├── BFDocument.swift │ │ │ ├── Manager/ │ │ │ │ ├── SQLConnection.swift │ │ │ │ ├── SQLHelper.swift │ │ │ │ ├── SQLLists.swift │ │ │ │ ├── SQLManager.swift │ │ │ │ ├── SQLStar+Delete.swift │ │ │ │ ├── SQLStar+Update.swift │ │ │ │ ├── SQLStars+Base.swift │ │ │ │ ├── SQLStars+Find.swift │ │ │ │ ├── SQLStars.swift │ │ │ │ └── SQLTags.swift │ │ │ └── Model/ │ │ │ └── ObjList.swift │ │ ├── ThirdParty/ │ │ │ ├── MobSDK/ │ │ │ │ ├── Required/ │ │ │ │ │ └── MOBFoundation.framework/ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ ├── IMOBBaseUser.h │ │ │ │ │ │ ├── IMOBFDataModel.h │ │ │ │ │ │ ├── IMOBFPlugin.h │ │ │ │ │ │ ├── MOBFApplication.h │ │ │ │ │ │ ├── MOBFColor.h │ │ │ │ │ │ ├── MOBFData.h │ │ │ │ │ │ ├── MOBFDataModel.h │ │ │ │ │ │ ├── MOBFDataService.h │ │ │ │ │ │ ├── MOBFDate.h │ │ │ │ │ │ ├── MOBFDebug.h │ │ │ │ │ │ ├── MOBFDevice.h │ │ │ │ │ │ ├── MOBFHttpPostedFile.h │ │ │ │ │ │ ├── MOBFHttpService.h │ │ │ │ │ │ ├── MOBFImage.h │ │ │ │ │ │ ├── MOBFImageCachePolicy.h │ │ │ │ │ │ ├── MOBFImageGetter.h │ │ │ │ │ │ ├── MOBFImageObserver.h │ │ │ │ │ │ ├── MOBFImageServiceTypeDef.h │ │ │ │ │ │ ├── MOBFJSContext.h │ │ │ │ │ │ ├── MOBFJSMethod.h │ │ │ │ │ │ ├── MOBFJSTypeDefine.h │ │ │ │ │ │ ├── MOBFJson.h │ │ │ │ │ │ ├── MOBFLogService.h │ │ │ │ │ │ ├── MOBFNotificationCenter.h │ │ │ │ │ │ ├── MOBFNumber.h │ │ │ │ │ │ ├── MOBFOAuthService.h │ │ │ │ │ │ ├── MOBFPluginManager.h │ │ │ │ │ │ ├── MOBFRSAHelper.h │ │ │ │ │ │ ├── MOBFRSAKey.h │ │ │ │ │ │ ├── MOBFRegex.h │ │ │ │ │ │ ├── MOBFString.h │ │ │ │ │ │ ├── MOBFUser.h │ │ │ │ │ │ ├── MOBFViewController.h │ │ │ │ │ │ ├── MOBFXml.h │ │ │ │ │ │ ├── MOBFXmlNode.h │ │ │ │ │ │ ├── MOBFoundation.h │ │ │ │ │ │ └── MobSDK.h │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── MOBFoundation │ │ │ │ │ ├── en.lproj/ │ │ │ │ │ │ └── InfoPlist.strings │ │ │ │ │ └── readme │ │ │ │ └── ShareSDK/ │ │ │ │ ├── ShareSDK.framework/ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ ├── IMOBFContentEntity.h │ │ │ │ │ │ ├── IMOBFShareComponent.h │ │ │ │ │ │ ├── IMOBFSocialUser.h │ │ │ │ │ │ ├── ISSDKAuthView.h │ │ │ │ │ │ ├── NSMutableDictionary+SSDKInit.h │ │ │ │ │ │ ├── NSMutableDictionary+SSDKShare.h │ │ │ │ │ │ ├── SSDKAuthViewStyle.h │ │ │ │ │ │ ├── SSDKContentEntity.h │ │ │ │ │ │ ├── SSDKCredential.h │ │ │ │ │ │ ├── SSDKData.h │ │ │ │ │ │ ├── SSDKHttpServiceModel.h │ │ │ │ │ │ ├── SSDKImage.h │ │ │ │ │ │ ├── SSDKPlatform.h │ │ │ │ │ │ ├── SSDKTypeDefine.h │ │ │ │ │ │ ├── SSDKUser.h │ │ │ │ │ │ ├── SSDKUserQueryConditional.h │ │ │ │ │ │ ├── SSDKVideoUploadCenter.h │ │ │ │ │ │ ├── ShareSDK+Base.h │ │ │ │ │ │ └── ShareSDK.h │ │ │ │ │ ├── Info.plist │ │ │ │ │ └── ShareSDK │ │ │ │ └── Support/ │ │ │ │ ├── Optional/ │ │ │ │ │ ├── ShareSDKConfigFile.bundle/ │ │ │ │ │ │ ├── Map.plist │ │ │ │ │ │ ├── ShareContent.xml │ │ │ │ │ │ └── ShareSDK.xml │ │ │ │ │ ├── ShareSDKConfigFile.framework/ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ └── ShareSDK+XML.h │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── ShareSDKConfigFile │ │ │ │ │ ├── ShareSDKExtension.framework/ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ ├── SSDKFriendsPaging.h │ │ │ │ │ │ │ ├── SSEBaseUser.h │ │ │ │ │ │ │ ├── SSEShareHelper.h │ │ │ │ │ │ │ ├── SSEThirdPartyLoginHelper.h │ │ │ │ │ │ │ ├── SSETypeDefine.h │ │ │ │ │ │ │ └── ShareSDK+Extension.h │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── ShareSDKExtension │ │ │ │ │ ├── ShareSDKUI.bundle/ │ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ │ └── ShareSDKUI_Localizable.strings │ │ │ │ │ │ ├── en.lproj/ │ │ │ │ │ │ │ └── ShareSDKUI_Localizable.strings │ │ │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ │ │ └── ShareSDKUI_Localizable.strings │ │ │ │ │ └── ShareSDKUI.framework/ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ ├── SSUIEditorViewStyle.h │ │ │ │ │ │ ├── SSUIShareActionSheetController.h │ │ │ │ │ │ ├── SSUIShareActionSheetCustomItem.h │ │ │ │ │ │ ├── SSUIShareActionSheetItem.h │ │ │ │ │ │ ├── SSUIShareActionSheetStyle.h │ │ │ │ │ │ ├── SSUIShareContentEditorViewController.h │ │ │ │ │ │ ├── SSUITypeDef.h │ │ │ │ │ │ ├── ShareSDK+SSUI.h │ │ │ │ │ │ └── ShareSDKUI.h │ │ │ │ │ ├── Info.plist │ │ │ │ │ └── ShareSDKUI │ │ │ │ ├── PlatformConnector/ │ │ │ │ │ ├── FacebookConnector.framework/ │ │ │ │ │ │ ├── FacebookConnector │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ └── FacebookConnector.h │ │ │ │ │ │ └── Info.plist │ │ │ │ │ ├── MailConnector.framework/ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ └── SSDKMailViewControllerStyle.h │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── MailConnector │ │ │ │ │ ├── QQConnector.framework/ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ └── QQConnector.h │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── QQConnector │ │ │ │ │ ├── SinaWeiboConnector.framework/ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ └── SinaWeiboConnector.h │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── SinaWeiboConnector │ │ │ │ │ ├── TwitterConnector.framework/ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── TwitterConnector │ │ │ │ │ └── WechatConnector.framework/ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ └── WeChatConnector.h │ │ │ │ │ ├── Info.plist │ │ │ │ │ └── WechatConnector │ │ │ │ ├── PlatformSDK/ │ │ │ │ │ ├── QQSDK/ │ │ │ │ │ │ ├── TencentOpenAPI.framework/ │ │ │ │ │ │ │ ├── Headers/ │ │ │ │ │ │ │ │ ├── QQApiInterface.h │ │ │ │ │ │ │ │ ├── QQApiInterfaceObject.h │ │ │ │ │ │ │ │ ├── TencentApiInterface.h │ │ │ │ │ │ │ │ ├── TencentMessageObject.h │ │ │ │ │ │ │ │ ├── TencentOAuth.h │ │ │ │ │ │ │ │ ├── TencentOAuthObject.h │ │ │ │ │ │ │ │ └── sdkdef.h │ │ │ │ │ │ │ ├── Resources/ │ │ │ │ │ │ │ │ ├── ios_open_sdk_3.1.0.3_iphone │ │ │ │ │ │ │ │ ├── ios_open_sdk_3.1.3.1_iphone │ │ │ │ │ │ │ │ └── ios_open_sdk_3.2.1.473_iphone_release │ │ │ │ │ │ │ └── TencentOpenAPI │ │ │ │ │ │ └── TencentOpenApi_IOS_Bundle.bundle/ │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ └── local.html │ │ │ │ │ ├── SinaWeiboSDK/ │ │ │ │ │ │ ├── WBHttpRequest+WeiboToken.h │ │ │ │ │ │ ├── WBHttpRequest.h │ │ │ │ │ │ ├── WeiboSDK+Statistics.h │ │ │ │ │ │ ├── WeiboSDK.bundle/ │ │ │ │ │ │ │ └── others/ │ │ │ │ │ │ │ └── mfp.cer │ │ │ │ │ │ ├── WeiboSDK.h │ │ │ │ │ │ └── libWeiboSDK.a │ │ │ │ │ └── WeChatSDK/ │ │ │ │ │ ├── README.txt │ │ │ │ │ ├── WXApi.h │ │ │ │ │ ├── WXApiObject.h │ │ │ │ │ ├── WechatAuthSDK.h │ │ │ │ │ └── libWeChatSDK.a │ │ │ │ └── Required/ │ │ │ │ ├── ShareSDK.bundle/ │ │ │ │ │ ├── Base.lproj/ │ │ │ │ │ │ ├── ShareSDK.strings │ │ │ │ │ │ └── country.plist │ │ │ │ │ ├── ScriptCore/ │ │ │ │ │ │ ├── NativeExt.js │ │ │ │ │ │ ├── ShareSDK.js │ │ │ │ │ │ └── platforms/ │ │ │ │ │ │ ├── Facebook.js │ │ │ │ │ │ ├── Mail.js │ │ │ │ │ │ ├── QQ.js │ │ │ │ │ │ ├── SinaWeibo.js │ │ │ │ │ │ ├── Twitter.js │ │ │ │ │ │ └── WeChat.js │ │ │ │ │ ├── en.lproj/ │ │ │ │ │ │ ├── ShareSDK.strings │ │ │ │ │ │ └── country.plist │ │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ │ ├── ShareSDK.strings │ │ │ │ │ └── country.plist │ │ │ │ └── ShareSDKConnector.framework/ │ │ │ │ ├── Headers/ │ │ │ │ │ └── ShareSDKConnector.h │ │ │ │ ├── Info.plist │ │ │ │ └── ShareSDKConnector │ │ │ └── UMMobClick.framework/ │ │ │ └── Versions/ │ │ │ └── A/ │ │ │ ├── Headers/ │ │ │ │ ├── MobClick.h │ │ │ │ ├── MobClickGameAnalytics.h │ │ │ │ └── MobClickSocialAnalytics.h │ │ │ └── UMMobClick │ │ ├── ToolKit/ │ │ │ └── JSToolKit/ │ │ │ ├── JSBridge/ │ │ │ │ ├── JSHMSegmentedBridge.swift │ │ │ │ ├── JSMBHUDBridge.swift │ │ │ │ ├── JSMBProgressHud.xcassets/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── jsmb_error.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── jsmb_info.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── jsmb_success.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── JSSQLiteSwiftBridge.swift │ │ │ │ ├── JSSVPHUDBridge.swift │ │ │ │ └── JSSwiftyBeaver.swift │ │ │ ├── JSFoundation/ │ │ │ │ ├── Array+Extension.swift │ │ │ │ ├── Bundle+Extension.swift │ │ │ │ ├── Character+Extension.swift │ │ │ │ ├── Data+Extension.swift │ │ │ │ ├── Dictionary+Extension.swift │ │ │ │ ├── DispatchQueue+Extension.swift │ │ │ │ ├── JSApp.swift │ │ │ │ ├── JSAssociatedObject.swift │ │ │ │ ├── JSClass.swift │ │ │ │ ├── JSDebug.swift │ │ │ │ ├── JSFoundation.swift │ │ │ │ ├── JSFoundationGlobal.swift │ │ │ │ ├── JSGCD.swift │ │ │ │ ├── JSLanguage.swift │ │ │ │ ├── JSObject.swift │ │ │ │ ├── JSUtilis.swift │ │ │ │ ├── NSAttributedString+Size.swift │ │ │ │ ├── NSObject+Extension.swift │ │ │ │ ├── NSString+Size.swift │ │ │ │ ├── README.md │ │ │ │ └── String+Extension.swift │ │ │ ├── JSModel/ │ │ │ │ └── README.md │ │ │ ├── JSStyleGuide/ │ │ │ │ ├── JSCommentStyleGudie.swift │ │ │ │ └── README.md │ │ │ ├── JSUI/ │ │ │ │ ├── JSSearchBar.swift │ │ │ │ └── TableViewCell/ │ │ │ │ ├── JSBaseCell.swift │ │ │ │ ├── JSCellDefine.swift │ │ │ │ ├── JSCellFactory.swift │ │ │ │ ├── JSCellModel+Init.swift │ │ │ │ ├── JSCellModel.swift │ │ │ │ ├── JSCellModelFactory.swift │ │ │ │ ├── JSCellProtocol.swift │ │ │ │ ├── JSCellUtils.swift │ │ │ │ ├── JSEditCell.swift │ │ │ │ ├── JSEditCell.xib │ │ │ │ ├── JSImageCell.swift │ │ │ │ ├── JSImageCell.xib │ │ │ │ ├── JSLabelCell.swift │ │ │ │ ├── JSLabelCell.xib │ │ │ │ ├── JSSelectedCell.swift │ │ │ │ ├── JSSelectedCell.xib │ │ │ │ ├── JSSubLabelCell.swift │ │ │ │ ├── JSSubLabelCell.xib │ │ │ │ ├── JSSwitchCell.swift │ │ │ │ ├── JSSwitchCell.xib │ │ │ │ ├── README.md │ │ │ │ └── TableViewCell.xcassets/ │ │ │ │ ├── Contents.json │ │ │ │ └── arrow_set_right.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── JSUIKit/ │ │ │ │ ├── CGRect+Extension.swift │ │ │ │ ├── JSApperence.swift │ │ │ │ ├── JSApplication.swift │ │ │ │ ├── JSCollectionViewCell.swift │ │ │ │ ├── JSDevice.swift │ │ │ │ ├── JSFileManager.swift │ │ │ │ ├── JSNavigationController.swift │ │ │ │ ├── JSTabBarController.swift │ │ │ │ ├── JSUIGlobal.swift │ │ │ │ ├── JSUIKit.swift │ │ │ │ ├── JSViewController.swift │ │ │ │ ├── NSMutableAttributedString.swift │ │ │ │ ├── README.md │ │ │ │ ├── UIAlertController+Extension.swift │ │ │ │ ├── UIColor+Extension.swift │ │ │ │ ├── UIDevice+Device.swift │ │ │ │ ├── UIImage+Extension.swift │ │ │ │ ├── UILabel+Extension.swift │ │ │ │ ├── UILabel+Size.swift │ │ │ │ ├── UINavigationController+Pop.swift │ │ │ │ ├── UIScreen+Size.swift │ │ │ │ ├── UIStoryboard+Extension.swift │ │ │ │ ├── UITextField+Extension.swift │ │ │ │ ├── UIView+Draw.swift │ │ │ │ └── UIView+Nib.swift │ │ │ └── README.md │ │ ├── View/ │ │ │ ├── Base/ │ │ │ │ ├── Controller/ │ │ │ │ │ ├── BFBaseTabBarController.swift │ │ │ │ │ └── BFWebViewController.swift │ │ │ │ └── ViewCell/ │ │ │ │ ├── BFBaseCell.swift │ │ │ │ └── BFSwipeCell.swift │ │ │ ├── BaseViewController/ │ │ │ │ ├── BFBaseViewController+Answer.swift │ │ │ │ ├── BFBaseViewController+Empty.swift │ │ │ │ ├── BFBaseViewController+Login.swift │ │ │ │ ├── BFBaseViewController+Nav.swift │ │ │ │ ├── BFBaseViewController+Noti.swift │ │ │ │ ├── BFBaseViewController+Refresh.swift │ │ │ │ ├── BFBaseViewController+Reload.swift │ │ │ │ ├── BFBaseViewController+TableView.swift │ │ │ │ └── BFBaseViewController.swift │ │ │ ├── Common/ │ │ │ │ ├── BFEmptyDataCell.swift │ │ │ │ └── BFPlaceHolderView.swift │ │ │ ├── Event/ │ │ │ │ ├── Event.xcassets/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── event_CommitCommentEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_CreateEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_DeleteEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_ForkEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_GollumEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_IssueCommentEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_IssuesEvent_closed.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_IssuesEvent_opened.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_MemberEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_PullRequestEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_PullRequestReviewCommentEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_PushEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_ReleaseEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_WatchEvent.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── event_commit_icon.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── git-pull-request_256.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── EventCell/ │ │ │ │ │ ├── BFEventBaseCell.swift │ │ │ │ │ ├── BFEventCell.swift │ │ │ │ │ ├── BFEventConstants.swift │ │ │ │ │ ├── BFEventLayout.swift │ │ │ │ │ └── BFEventParase.swift │ │ │ │ └── NotUse/ │ │ │ │ ├── BFEventCommitView.swift │ │ │ │ ├── BFEventPRDetailView.swift │ │ │ │ ├── BFEventTextView.swift │ │ │ │ ├── BFEventTimeView.swift │ │ │ │ ├── BFEventTitleView.swift │ │ │ │ ├── BFEventView.swift │ │ │ │ └── BFImageViewAttachment.swift │ │ │ ├── Gist/ │ │ │ │ └── BFGistViewController.swift │ │ │ ├── Issue/ │ │ │ │ └── ViewCell/ │ │ │ │ ├── CPMesIssueCell.swift │ │ │ │ └── CPMesIssueCell.xib │ │ │ ├── Message/ │ │ │ │ ├── BFMessageConentView.swift │ │ │ │ ├── BFMessageController.swift │ │ │ │ └── InsetNavigationBar.swift │ │ │ ├── NewTrending/ │ │ │ │ └── BFNewTrendingController.swift │ │ │ ├── Notification/ │ │ │ │ └── ViewCell/ │ │ │ │ ├── CPMesNotificationCell.swift │ │ │ │ └── CPMesNotificationCell.xib │ │ │ ├── Profile/ │ │ │ │ ├── BFProfileController+Data.swift │ │ │ │ ├── BFProfileController.swift │ │ │ │ ├── Feedback/ │ │ │ │ │ ├── BFFeedbackController.swift │ │ │ │ │ └── BFFeedbackIssueController.swift │ │ │ │ ├── Funny/ │ │ │ │ │ ├── BFFunnyLabViewController.swift │ │ │ │ │ └── CPFunnyAwardViewController.swift │ │ │ │ ├── ProfileModule.xcassets/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── Profile/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── default.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── edit_profile.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── lab_award_50.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── profile_bg.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── settingsicon/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── set_about.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_feedback.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_list.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_money.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_rate.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_settings.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_settings_white.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_share.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_sync.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── set_tag.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── set_watched.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Setting/ │ │ │ │ │ ├── BFAboutViewController.swift │ │ │ │ │ ├── BFSettingsViewController.swift │ │ │ │ │ ├── en.lproj/ │ │ │ │ │ │ └── BFAbout.plist │ │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ │ └── BFAbout.plist │ │ │ │ ├── StarTag/ │ │ │ │ │ ├── BFAddNewTagsController.swift │ │ │ │ │ ├── BFListsManageController.swift │ │ │ │ │ ├── BFReposSyncController.swift │ │ │ │ │ ├── BFTagsManageController.swift │ │ │ │ │ ├── en.lproj/ │ │ │ │ │ │ └── BFRepoSync.plist │ │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ │ └── BFRepoSync.plist │ │ │ │ ├── User/ │ │ │ │ │ └── BFEditUserController.swift │ │ │ │ ├── ViewCell/ │ │ │ │ │ └── CPPersonCardView.swift │ │ │ │ ├── en.lproj/ │ │ │ │ │ └── BFProfile.plist │ │ │ │ └── zh-Hans.lproj/ │ │ │ │ └── BFProfile.plist │ │ │ ├── Repository/ │ │ │ │ ├── BFRepoDetailController+Data.swift │ │ │ │ ├── BFRepoDetailController.swift │ │ │ │ ├── BFRepoListController.swift │ │ │ │ ├── RepositoryCell/ │ │ │ │ │ ├── BFRepositoryTypeFourCell.swift │ │ │ │ │ ├── BFRepositoryTypeFourCell.xib │ │ │ │ │ ├── BFRepositoryTypeOneCell.swift │ │ │ │ │ ├── BFRepositoryTypeOneCell.xib │ │ │ │ │ ├── BFRepositoryTypeSecCell.swift │ │ │ │ │ ├── BFRepositoryTypeSecCell.xib │ │ │ │ │ ├── BFRepositoryTypeThirdCell.swift │ │ │ │ │ └── BFRepositoryTypeThirdCell.xib │ │ │ │ └── View/ │ │ │ │ ├── CPReposInfoView.swift │ │ │ │ └── CPReposPosterView.swift │ │ │ ├── Search/ │ │ │ │ ├── ResultResponse/ │ │ │ │ │ ├── SEResponseCode.swift │ │ │ │ │ ├── SEResponseCommits.swift │ │ │ │ │ ├── SEResponseIssues.swift │ │ │ │ │ ├── SEResponseRepos.swift │ │ │ │ │ ├── SEResponseUsers.swift │ │ │ │ │ └── SEResponseWikis.swift │ │ │ │ ├── SESearchResultContentView.swift │ │ │ │ ├── SESearchResultController+Action.swift │ │ │ │ ├── SESearchResultController+View.swift │ │ │ │ ├── SESearchResultController.swift │ │ │ │ ├── SESearchViewController+View.swift │ │ │ │ ├── SESearchViewController.swift │ │ │ │ ├── SearchModel/ │ │ │ │ │ ├── SESearchBaseModel.swift │ │ │ │ │ ├── SESearchCodeModel.swift │ │ │ │ │ ├── SESearchCommitModel.swift │ │ │ │ │ ├── SESearchIssueModel.swift │ │ │ │ │ ├── SESearchRepoModel.swift │ │ │ │ │ ├── SESearchUserModel.swift │ │ │ │ │ └── SESearchWikiModel.swift │ │ │ │ ├── SearchModule.xcassets/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── se_down_triangle.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── se_down_triangle_sel.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── se_lang_switch.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── se_up_triangle.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── se_up_triangle_sel.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── ViewCell/ │ │ │ │ ├── SESearchCodeCell.swift │ │ │ │ └── SESearchOrderButton.swift │ │ │ ├── Stars/ │ │ │ │ ├── BFStarContentView.swift │ │ │ │ ├── BFStarController+Data.swift │ │ │ │ ├── BFStarController+Noti.swift │ │ │ │ ├── BFStarController+View.swift │ │ │ │ ├── BFStarController.swift │ │ │ │ └── ViewCell/ │ │ │ │ ├── BFStarViewModel.swift │ │ │ │ └── JSSegmentControl.swift │ │ │ ├── Tag/ │ │ │ │ ├── BFUpdateTagsController.swift │ │ │ │ ├── ListView/ │ │ │ │ │ └── ListScrollView.swift │ │ │ │ └── TagView/ │ │ │ │ ├── AddTagsCell.swift │ │ │ │ ├── AddTagsCell.xib │ │ │ │ ├── JSScrollContentView.swift │ │ │ │ ├── JSTagBar.swift │ │ │ │ ├── JSTagItem.swift │ │ │ │ └── ShowTagsCell.swift │ │ │ ├── Trending/ │ │ │ │ ├── BFShowcaseDetailController.swift │ │ │ │ ├── BFTrendingController+Data.swift │ │ │ │ ├── BFTrendingController+View.swift │ │ │ │ ├── BFTrendingController.swift │ │ │ │ ├── Model/ │ │ │ │ │ ├── BFExploreNavigationModel.swift │ │ │ │ │ ├── BFGihubTrendingTimeEnum.swift │ │ │ │ │ ├── BFGithubTrendingRequsetModel.swift │ │ │ │ │ ├── BFGithubTrendingUserModel.swift │ │ │ │ │ └── BFGithubTrengingModel.swift │ │ │ │ └── ViewCell/ │ │ │ │ ├── BFShowcaseHeaderView.swift │ │ │ │ ├── BFShowcaseHeaderView.xib │ │ │ │ ├── BFTrendingSearchBar.swift │ │ │ │ ├── BFTrendingShowcaseCell.swift │ │ │ │ ├── BFTrendingShowcaseCell.xib │ │ │ │ ├── CPFilterTableView.swift │ │ │ │ └── InfoButton.swift │ │ │ └── User/ │ │ │ ├── BFUserDetailController.swift │ │ │ ├── BFUserListController.swift │ │ │ ├── UserCell/ │ │ │ │ ├── BFUserTypeOneCell.swift │ │ │ │ ├── BFUserTypeOneCell.xib │ │ │ │ ├── BFUserTypeSecCell.swift │ │ │ │ ├── BFUserTypeSecCell.xib │ │ │ │ ├── BFUserTypeThirdCell.swift │ │ │ │ └── BFUserTypeThirdCell.xib │ │ │ └── View/ │ │ │ └── CPDeveloperInfoView.swift │ │ ├── en.lproj/ │ │ │ └── Main.storyboard │ │ └── zh-Hans.lproj/ │ │ └── LaunchScreen.strings │ ├── BeeFun.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── BeeFun.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ ├── Podfile │ ├── XcodeConfig/ │ │ ├── Adhoc.xcconfig │ │ ├── Common.xcconfig │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── fastlane/ │ │ ├── Appfile │ │ ├── Deliverfile │ │ ├── Fastfile │ │ ├── Gymfile │ │ ├── Matchfile │ │ ├── README.md │ │ ├── metadata/ │ │ │ ├── copyright.txt │ │ │ ├── en-US/ │ │ │ │ ├── description.txt │ │ │ │ ├── keywords.txt │ │ │ │ ├── marketing_url.txt │ │ │ │ ├── name.txt │ │ │ │ ├── privacy_url.txt │ │ │ │ ├── release_notes.txt │ │ │ │ └── support_url.txt │ │ │ ├── primary_category.txt │ │ │ ├── primary_first_sub_category.txt │ │ │ ├── primary_second_sub_category.txt │ │ │ ├── review_information/ │ │ │ │ ├── demo_password.txt │ │ │ │ ├── demo_user.txt │ │ │ │ ├── email_address.txt │ │ │ │ ├── first_name.txt │ │ │ │ ├── last_name.txt │ │ │ │ ├── notes.txt │ │ │ │ └── phone_number.txt │ │ │ ├── secondary_category.txt │ │ │ ├── secondary_first_sub_category.txt │ │ │ ├── secondary_second_sub_category.txt │ │ │ └── zh-Hans/ │ │ │ ├── description.txt │ │ │ ├── keywords.txt │ │ │ ├── marketing_url.txt │ │ │ ├── name.txt │ │ │ ├── privacy_url.txt │ │ │ ├── release_notes.txt │ │ │ └── support_url.txt │ │ ├── report.xml │ │ └── screenshots/ │ │ └── README.txt │ └── infer-out/ │ ├── attributes/ │ │ ├── CALayer_addSublayer:{instance}.48a93d8cb92e1bcef68cee21e613cf95.attr │ │ ├── CALayer_bounds{instance}.05a14cdc597280814edca2dc485a0fee.attr │ │ ├── CALayer_init{instance}.00dc135da186f2a34f3805a805a35a91.attr │ │ ├── CALayer_insertSublayer:atIndex:{instance}.d6358edc3f8395b7e0c7b0a036eb8be6.attr │ │ ├── CALayer_layer{class}.e985d540f7ae90b6ac7db0f6e58a6e1c.attr │ │ ├── CALayer_removeFromSuperlayer{instance}.89c0bbb57ec5874e41c61589026c3064.attr │ │ ├── CALayer_setActions:{instance}.d9f27685491cc59c13fb6a9dcb636009.attr │ │ ├── CALayer_setBackgroundColor:{instance}.d6ac9338643452b51ac7443f3f1e033c.attr │ │ ├── CALayer_setBorderColor:{instance}.69ba515004abcd632bce6892427cdfd7.attr │ │ ├── CALayer_setBorderWidth:{instance}.f3d42ffd8eacc287f4d7188094aa842c.attr │ │ ├── CALayer_setContents:{instance}.1656da7412d61474a43157b587ebacc2.attr │ │ ├── CALayer_setContentsScale:{instance}.403e7c4eeebcee89536f58a4663472e8.attr │ │ ├── CALayer_setFrame:{instance}.3b9c927a1c2d285dcedd624d4fb04423.attr │ │ ├── CALayer_setMask:{instance}.82d6656c31e620e2a467bf15478f2dd2.attr │ │ ├── CALayer_setOpacity:{instance}.55609ad7528b3c373bb2afdd25d5cdf9.attr │ │ ├── CALayer_setSublayers:{instance}.df75a759e0805a82418e67dd6a512c8a.attr │ │ ├── CALayer_superlayer{instance}.c6293744268bcadda0487f1157270c19.attr │ │ ├── CAMediaTimingFunction_functionWithName:{class}.19cd6945dc10c4f6edcd922534788f9c.attr │ │ ├── CAShapeLayer_setPath:{instance}.dbb3dfb480244dfb244f7a1e15979262.attr │ │ ├── CATextLayer_setAlignmentMode:{instance}.4f6de10f0f042a4e044697b905bb1304.attr │ │ ├── CATextLayer_setString:{instance}.0d04c35a3e3fc33a500758196865dcdf.attr │ │ ├── CATextLayer_setTruncationMode:{instance}.82a2c9c1fef34ee2347ef1c4761bfea5.attr │ │ ├── CATransaction_begin{class}.851bef7307bff524fb4433a42fcd320c.attr │ │ ├── CATransaction_commit{class}.3f84648cb6b0d16dc28e5966585af788.attr │ │ ├── CATransaction_setAnimationDuration:{class}.588d842f04f47f548d4a966b27d20e38.attr │ │ ├── CATransaction_setAnimationTimingFunction:{class}.c82194a8439cb4700a25c3fc64b7902c.attr │ │ ├── CGAffineTransformConcat.d53f1c202a769649157225dddcd1cb5a.attr │ │ ├── CGAffineTransformMakeRotation.70cd7ef546e468e69b2b3a7c79275bdc.attr │ │ ├── CGAffineTransformMakeScale.e2f2530e20d5f4373f362ee125809230.attr │ │ ├── CGColorSpaceCreateDeviceRGB.ba66fb2e5605d2fdcbdd9025d50994c2.attr │ │ ├── CGColorSpaceRelease.61e1e802e46513e43dc69aff2da5563a.attr │ │ ├── CGContextAddArc.a7d2d85ff6e956e49280efc29de5d08c.attr │ │ ├── CGContextAddArcToPoint.6bda987971d6a10a79ed0aed6eb8b99b.attr │ │ ├── CGContextAddLineToPoint.59ce028dc7b71069fefe4775ed34c29e.attr │ │ ├── CGContextBeginPath.1ce5efef25c98326e0ba94fc71df34e3.attr │ │ ├── CGContextClosePath.e4dcf76d0a3fa61121ff82263cc49506.attr │ │ ├── CGContextDrawRadialGradient.99a292382c140552bf18582d0baf5179.attr │ │ ├── CGContextFillEllipseInRect.746ad1e29412b80fd7f21c9b5dfd9e77.attr │ │ ├── CGContextFillPath.0d9b19fcd1e8e8530ab71cdca0659f4a.attr │ │ ├── CGContextMoveToPoint.2ff5372957b6ca7702c780e625380337.attr │ │ ├── CGContextSetFillColorWithColor.da9ad2c3ac7ccdfcb573c41f5967697e.attr │ │ ├── CGContextSetGrayFillColor.4a3ee89ac153cfa556a498868b493d76.attr │ │ ├── CGContextSetLineWidth.3eca87eabe1da299b1bc637a2e2c2026.attr │ │ ├── CGContextSetStrokeColorWithColor.8f70fdeb1b1a1ed7c867dc2c17567857.attr │ │ ├── CGContextStrokeEllipseInRect.10a47082c627075971b9d65a1c59a8e4.attr │ │ ├── CGContextStrokePath.e1984260c9d3b0b034e494e5c561e083.attr │ │ ├── CGGradientCreateWithColorComponents.c1bcf541a0344cf83ab5462b64cf9024.attr │ │ ├── CGGradientRelease.c8ab0f658a03819c756f07a0faff31e9.attr │ │ ├── CGPointMake{8f2d787b659f0921d68828fa902f5c6a}.c5b59586ef71f48b3ed72eabbbadc941.attr │ │ ├── CGRectContainsPoint.30e26dc287538e23f5b1a2980699fd57.attr │ │ ├── CGRectGetHeight.039c89ff492d7b5a8810e1ad5ca220ae.attr │ │ ├── CGRectGetMaxX.306dddb5878e5321e59ad7fae597a77f.attr │ │ ├── CGRectGetMaxY.9abd48b2ea1b32f0d74429e5d009f1b7.attr │ │ ├── CGRectGetMinX.bfa5b203fe4ad6ff11d4a2c42f3653fe.attr │ │ ├── CGRectGetMinY.1c2eb0c667170abbdbd24fedce4da231.attr │ │ ├── CGRectGetWidth.2f54703e3e65c9723f5209221514f786.attr │ │ ├── CGRectInset.5a782c449e341b994a93839b8993ac8e.attr │ │ ├── CGRectIntegral.a7454be352381d42006cea0a2d62f233.attr │ │ ├── CGRectMake{8f2d787b659f0921d68828fa902f5c6a}.fb4e5eb9586b49fd86b6da3c00924ba8.attr │ │ ├── CGSizeMake{8f2d787b659f0921d68828fa902f5c6a}.e9776dac6163629af80900da9060da71.attr │ │ ├── HMScrollView_touchesBegan:withEvent:{instance}.d59f2b4a0fda4ec48b036513c8dd8cc9.attr │ │ ├── HMScrollView_touchesEnded:withEvent:{instance}.8f3c38acc9d5dc615c13261818676983.attr │ │ ├── HMScrollView_touchesMoved:withEvent:{instance}.c1670bac25a0a202b52dda692c907230.attr │ │ ├── HMSegmentedControl_addBackgroundAndBorderLayerWithRect:{instance}.7dd0377b1da0e5b410137e62fdec2030.attr │ │ ├── HMSegmentedControl_attributedTitleAtIndex:{instance}.a5b762b44c0d812624d2256563840cc5.attr │ │ ├── HMSegmentedControl_awakeFromNib{instance}.f3fa814debe72a72b9e0eb7ccf2e15a5.attr │ │ ├── HMSegmentedControl_backgroundColor{instance}.6c0d975be62ba854f7bab2eb41bd65df.attr │ │ ├── HMSegmentedControl_borderColor{instance}.c974aed1ac3888a88a88edca77f3c4c4.attr │ │ ├── HMSegmentedControl_borderType{instance}.7bdcff07d24df6f0c700bf184c07c007.attr │ │ ├── HMSegmentedControl_borderWidth{instance}.56af3b362891b90f3116f2baa5fa35d8.attr │ │ ├── HMSegmentedControl_commonInit{instance}.38533cdade2a6665dabfbf9b34dfee27.attr │ │ ├── HMSegmentedControl_drawRect:{instance}.0f8cfeaafe528d71c9e70549d32ab6c8.attr │ │ ├── HMSegmentedControl_frameForFillerSelectionIndicator{instance}.ee003ec468962badb351fdc66dbf4daf.attr │ │ ├── HMSegmentedControl_frameForSelectionIndicator{instance}.fab573ad9ae86c7cadaf030789e843c9.attr │ │ ├── HMSegmentedControl_indexChangeBlock{instance}.b158b19f6cc684f30219f4d8828755ff.attr │ │ ├── HMSegmentedControl_initWithCoder:{instance}.a09c14109303b8ad5c335eb9da3d110b.attr │ │ ├── HMSegmentedControl_initWithFrame:{instance}.a49a182bda2ad6bcf70effd8929a23fc.attr │ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:{instance}.b753ee5d390184caf95711bd19d683b5.attr │ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:{instance}.e9b578c4330b480104536188b8a8c976.attr │ │ ├── HMSegmentedControl_initWithSectionTitles:{instance}.437880827dc06daf2642eb51cedee689.attr │ │ ├── HMSegmentedControl_isTouchEnabled{instance}.b6d3723e21062d88a646a99466f45bbb.attr │ │ ├── HMSegmentedControl_isUserDraggable{instance}.53bf5d04f2560750c8db0013c5c7e713.attr │ │ ├── HMSegmentedControl_isVerticalDividerEnabled{instance}.b09fc4da7cc72200f09e858a18f0a5c3.attr │ │ ├── HMSegmentedControl_layoutSubviews{instance}.68711c72c0e4854dcc75ef707417c22e.attr │ │ ├── HMSegmentedControl_measureTitleAtIndex:{instance}.b9e49ac420b85b440d716583a1199bd7.attr │ │ ├── HMSegmentedControl_notifyForSegmentChangeToIndex:{instance}.9961984e3a59a06f9dce68085bd94b07.attr │ │ ├── HMSegmentedControl_resultingSelectedTitleTextAttributes{instance}.cc39ce9e58be4ecf606a42f75b7a1e18.attr │ │ ├── HMSegmentedControl_resultingTitleTextAttributes{instance}.c6edf072205c8920b9c3804bcb465668.attr │ │ ├── HMSegmentedControl_scrollToSelectedSegmentIndex:{instance}.3b10d351a059eceb4ce7dcc296c10e6b.attr │ │ ├── HMSegmentedControl_scrollView{instance}.984a4cd4e0dfd407e8b2debe9112308f.attr │ │ ├── HMSegmentedControl_sectionCount{instance}.8f2d3f243fe8914f47b850886fe77ce5.attr │ │ ├── HMSegmentedControl_sectionImages{instance}.2c89149c36883d5f50273d129dec6929.attr │ │ ├── HMSegmentedControl_sectionSelectedImages{instance}.62be27fd0fa44ff0550190f5a86af929.attr │ │ ├── HMSegmentedControl_sectionTitles{instance}.fe4a558b033f4b6549cb1d3435ca8234.attr │ │ ├── HMSegmentedControl_segmentEdgeInset{instance}.e0705631980423e348b31e19c90a75b3.attr │ │ ├── HMSegmentedControl_segmentWidthStyle{instance}.12cd0162148658cf774f62bc5b3e8097.attr │ │ ├── HMSegmentedControl_segmentWidthsArray{instance}.d95c7a7f5402c830e91e1085601b4cbc.attr │ │ ├── HMSegmentedControl_segmentWidth{instance}.a5361ec3cba8ff2f3a20d186aa1022ad.attr │ │ ├── HMSegmentedControl_selectedSegmentIndex{instance}.3863c2728a2b24b92ba408d6142e4d0d.attr │ │ ├── HMSegmentedControl_selectedTitleTextAttributes{instance}.fa671cbd20cdcb95c0cf3a94dbd92914.attr │ │ ├── HMSegmentedControl_selectionIndicatorArrowLayer{instance}.60a49ba9ad9d06b6055d839226b15da3.attr │ │ ├── HMSegmentedControl_selectionIndicatorBoxLayer{instance}.eef7d0a9587700f4acf53912b3f28982.attr │ │ ├── HMSegmentedControl_selectionIndicatorBoxOpacity{instance}.2bec172ee87e87586fbd7788de1e6e1b.attr │ │ ├── HMSegmentedControl_selectionIndicatorColor{instance}.f9cffb745cc69caa672cf9d3f8e0a8bd.attr │ │ ├── HMSegmentedControl_selectionIndicatorEdgeInsets{instance}.ba400682bc26b3cf3ba183e96dc2c33a.attr │ │ ├── HMSegmentedControl_selectionIndicatorHeight{instance}.2944d21c028e844d04f9bbeefc36e9e8.attr │ │ ├── HMSegmentedControl_selectionIndicatorLocation{instance}.a8b2f1bda54916a7eeeafe590d695021.attr │ │ ├── HMSegmentedControl_selectionIndicatorStripLayer{instance}.f63177354a353fc6cdeecb71a5cf2080.attr │ │ ├── HMSegmentedControl_selectionStyle{instance}.b1fc3e4fba245c89c4ff7a815f84c362.attr │ │ ├── HMSegmentedControl_setArrowFrame{instance}.5826476954afd05d70ceb71ec673b941.attr │ │ ├── HMSegmentedControl_setBorderColor:{instance}.a7cf3e92ecb3272d9c6d4e0b7ad2458d.attr │ │ ├── HMSegmentedControl_setBorderType:{instance}.913cdb23a533132e5838aec6b4e59339.attr │ │ ├── HMSegmentedControl_setBorderWidth:{instance}.4cb88623f795907950d15373b8278a8a.attr │ │ ├── HMSegmentedControl_setFrame:{instance}.1c7263eacfefb1784864fef2d128686f.attr │ │ ├── HMSegmentedControl_setScrollView:{instance}.e95cf1c7b8bd26a3765fe4245f5c5a7a.attr │ │ ├── HMSegmentedControl_setSectionImages:{instance}.dd1712712826815f898cd900d8051af2.attr │ │ ├── HMSegmentedControl_setSectionSelectedImages:{instance}.46d9ea6d3851678a0e210a2f91876f28.attr │ │ ├── HMSegmentedControl_setSectionTitles:{instance}.659c7c1b9fb7032b7e893febe52349bc.attr │ │ ├── HMSegmentedControl_setSegmentEdgeInset:{instance}.a5400ed9831e9d14bfe8f49ab3aec4eb.attr │ │ ├── HMSegmentedControl_setSegmentWidth:{instance}.f9020ca34ccdfb8f3fae1fdab00eb581.attr │ │ ├── HMSegmentedControl_setSegmentWidthStyle:{instance}.0e2d4c1c6e034b4ded13d0bda80fc966.attr │ │ ├── HMSegmentedControl_setSegmentWidthsArray:{instance}.f19fa5029d441b0f0c65cacae4a5ddd0.attr │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:notify:{instance}.e28550bafd2dd200d908ec93bf0f5f6f.attr │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:{instance}.2d10a374506ae4092dce3c89aa0d3ed2.attr │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:{instance}.7c671210f6f2a504f070e13fa74c6c0f.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorArrowLayer:{instance}.e91cba373a89945a6566f1e41d15cd40.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorBoxLayer:{instance}.54fd874b9d7c488d6cb40c9e007a4303.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorBoxOpacity:{instance}.45b69f43098a4683dfc106f58afed905.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorEdgeInsets:{instance}.2c6d7402b479f3a13e2af00c660fe2bc.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorHeight:{instance}.bbbd0c2cbae92d35f3ecf1c745380fa4.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorLocation:{instance}.a53daba01d6a3f4bf906c7cecf124d14.attr │ │ ├── HMSegmentedControl_setSelectionIndicatorStripLayer:{instance}.445c4639123dbf524d6b075052ef6129.attr │ │ ├── HMSegmentedControl_setSelectionStyle:{instance}.db234355255ede1270daa164a4d9da4c.attr │ │ ├── HMSegmentedControl_setShouldAnimateUserSelection:{instance}.1d4757295d44983747a4234f6eeaf607.attr │ │ ├── HMSegmentedControl_setTouchEnabled:{instance}.c79ba177add22f1672903cf5dd0f97f0.attr │ │ ├── HMSegmentedControl_setType:{instance}.4632bffa99b29a9b631888269edbd957.attr │ │ ├── HMSegmentedControl_setUserDraggable:{instance}.a94d539fa41650dc0e32142bb6b7064f.attr │ │ ├── HMSegmentedControl_setVerticalDividerEnabled:{instance}.8c74a8159fb14bbc2e9dc12ef36e8564.attr │ │ ├── HMSegmentedControl_setVerticalDividerWidth:{instance}.4dfb08e915f4ce87cd4008c7e06130ef.attr │ │ ├── HMSegmentedControl_shouldAnimateUserSelection{instance}.b91bf96db0958ea8866d1d89531db03f.attr │ │ ├── HMSegmentedControl_titleFormatter{instance}.164ceaaacc6ba02b8c16e5eb8030c4bf.attr │ │ ├── HMSegmentedControl_titleTextAttributes{instance}.18091c08590b90b9883d798769be6f76.attr │ │ ├── HMSegmentedControl_totalSegmentedControlWidth{instance}.0d2a745a35745340bb11b6dca1981618.attr │ │ ├── HMSegmentedControl_touchesEnded:withEvent:{instance}.4e627b0727b096ec8303653816d71374.attr │ │ ├── HMSegmentedControl_type{instance}.977b3eb3d4522b4a872303ef2272c048.attr │ │ ├── HMSegmentedControl_updateSegmentsRects{instance}.84ec9da3b15ae6609959e7b9d4e514d6.attr │ │ ├── HMSegmentedControl_verticalDividerColor{instance}.35d31e2c8524c3431cf3efdb0458c253.attr │ │ ├── HMSegmentedControl_verticalDividerWidth{instance}.670b4aba0a822417c77bef3aff1caeab.attr │ │ ├── HMSegmentedControl_willMoveToSuperview:{instance}.664e57902a9674b629014432c158bbe2.attr │ │ ├── MBBarProgressView_dealloc{instance}.adf1ad15c84766ba9dcf79183c69c3d4.attr │ │ ├── MBBarProgressView_drawRect:{instance}.320d681186c8fba8f6b277de3f5578a2.attr │ │ ├── MBBarProgressView_initWithFrame:{instance}.ed6320a3deccb73365df0525f4c1b164.attr │ │ ├── MBBarProgressView_init{instance}.d718a21a2e82160043ea8993b48ff857.attr │ │ ├── MBBarProgressView_observableKeypaths{instance}.39b90d036d77a64fc5e4fecf6065c87c.attr │ │ ├── MBBarProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.7954f9a6af46f9f68c1a1f6b5a2ccdd2.attr │ │ ├── MBBarProgressView_progress{instance}.560fdc46cd8df96a995256bbc4cff61e.attr │ │ ├── MBBarProgressView_registerForKVO{instance}.071c8b1636d94f57ae8971bc36daf118.attr │ │ ├── MBBarProgressView_unregisterFromKVO{instance}.b5a5120611688f493d5727fdfa6d5960.attr │ │ ├── MBProgressHUD_HUDForView:{class}.a2951ab8562d7ef65f3c11867a36db30.attr │ │ ├── MBProgressHUD_activityIndicatorColor{instance}.2d61416f4d99fbfea16e34f1761a4a42.attr │ │ ├── MBProgressHUD_allHUDsForView:{class}.c62400802f12bd5a57844c12fcb0585f.attr │ │ ├── MBProgressHUD_animationFinished:finished:context:{instance}.9c5e683b9e4ea724431986aec092468a.attr │ │ ├── MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3.attr │ │ ├── MBProgressHUD_color{instance}.7b97e272716405b208ddb9874ba77e20.attr │ │ ├── MBProgressHUD_completionBlock{instance}.1ad46d55ec211f7a949fe770b4dc71b5.attr │ │ ├── MBProgressHUD_cornerRadius{instance}.7ca50c7c725e4c51425bfb2bae6b3274.attr │ │ ├── MBProgressHUD_dealloc{instance}.734bfbc384d83cb0e26dba7831bb5b5a.attr │ │ ├── MBProgressHUD_detailsLabelColor{instance}.d810728d8d2cf38296782ee23d415dae.attr │ │ ├── MBProgressHUD_detailsLabelFont{instance}.3a177fd27f802c9ea8c5f1d0cdff42cc.attr │ │ ├── MBProgressHUD_detailsLabelText{instance}.0574adaba50347f8e1aa3e9a425906f7.attr │ │ ├── MBProgressHUD_didMoveToSuperview{instance}.bdd65a2c02acb5f730c9ffafb0a5d09e.attr │ │ ├── MBProgressHUD_dimBackground{instance}.6b895a8d19f40262d2e45cd4088cdff8.attr │ │ ├── MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a.attr │ │ ├── MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604.attr │ │ ├── MBProgressHUD_graceTime{instance}.8fd19d236ee22e1fa2d15aeea932664a.attr │ │ ├── MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9.attr │ │ ├── MBProgressHUD_handleMinShowTimer:{instance}.7aafa41664c3ff7af3a291cab98261c3.attr │ │ ├── MBProgressHUD_hide:afterDelay:{instance}.c859a390b6e21c3da53cc55db145fc51.attr │ │ ├── MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507.attr │ │ ├── MBProgressHUD_hideAllHUDsForView:animated:{class}.0c50aff8a43d35a50e24dbcc63a30a32.attr │ │ ├── MBProgressHUD_hideDelayed:{instance}.c1ee27a326a7aff4bb96a0c3c0081baf.attr │ │ ├── MBProgressHUD_hideHUDForView:animated:{class}.6464d2a2482f9e32e72a33627277d762.attr │ │ ├── MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03.attr │ │ ├── MBProgressHUD_initWithFrame:{instance}.46a9a5ebd85df85c40e4ca277186520f.attr │ │ ├── MBProgressHUD_initWithView:{instance}.56c371965dcee9d54c2d7a562e2ae498.attr │ │ ├── MBProgressHUD_initWithWindow:{instance}.d9abb98f4c74d9d83026534b730b52d2.attr │ │ ├── MBProgressHUD_labelColor{instance}.9d7464c5bbb5afbeb216081e82817b7a.attr │ │ ├── MBProgressHUD_labelFont{instance}.70faec2749c5ee8f67aa368639130a9a.attr │ │ ├── MBProgressHUD_labelText{instance}.357a40814f1c8fb1a46c510697a15719.attr │ │ ├── MBProgressHUD_launchExecution{instance}.65b7de815299c22603cdc0a12874e621.attr │ │ ├── MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0.attr │ │ ├── MBProgressHUD_minShowTime{instance}.dd94b4eb4d38971c76f088bd6b4e5f95.attr │ │ ├── MBProgressHUD_observableKeypaths{instance}.1d43b626b757e9a1ab7fb2a4953c8d2d.attr │ │ ├── MBProgressHUD_observeValueForKeyPath:ofObject:change:context:{instance}.6f2717bd4c58c58b1cd5304e7bfb403b.attr │ │ ├── MBProgressHUD_opacity{instance}.579a958bf7f4e1d992df9f634e28bbac.attr │ │ ├── MBProgressHUD_registerForKVO{instance}.74d4196c6bc96800ebeadb3eade5e76a.attr │ │ ├── MBProgressHUD_registerForNotifications{instance}.c083e50aaf59e994cdd425e4c9cf446b.attr │ │ ├── MBProgressHUD_setActivityIndicatorColor:{instance}.f24d774d97c34f1c2c8c1ae0bf2c1273.attr │ │ ├── MBProgressHUD_setAnimationType:{instance}.b5811b9f743fc37317bcdc2001b385ec.attr │ │ ├── MBProgressHUD_setColor:{instance}.87a22a9c5fb03c6a289155584ae01252.attr │ │ ├── MBProgressHUD_setCompletionBlock:{instance}.9958faa8671959243d097f15bf7cd735.attr │ │ ├── MBProgressHUD_setCornerRadius:{instance}.5e4384b83b4c8a1047f09cedb24fbc1b.attr │ │ ├── MBProgressHUD_setDetailsLabelColor:{instance}.4758e16052b436d294d43b2458e2344f.attr │ │ ├── MBProgressHUD_setDetailsLabelFont:{instance}.2ba74226e9a47ebe3ee377eee7aeda77.attr │ │ ├── MBProgressHUD_setDetailsLabelText:{instance}.5afc06844e84eff171f543be0a1e3284.attr │ │ ├── MBProgressHUD_setDimBackground:{instance}.df31cc40ed53290d7a62a4bd9c29b6eb.attr │ │ ├── MBProgressHUD_setGraceTime:{instance}.90a68b65efaaf31e5c6fb64b16e4841c.attr │ │ ├── MBProgressHUD_setGraceTimer:{instance}.a11af2368eb0f75014da9ce40b64e334.attr │ │ ├── MBProgressHUD_setIndicator:{instance}.1493dede8b97b7b574fd526b59f8fcf6.attr │ │ ├── MBProgressHUD_setLabelColor:{instance}.56abb3a6d08248e4bf1c0564b9e6ad18.attr │ │ ├── MBProgressHUD_setLabelFont:{instance}.d491e14520fe29a85cde554d6c36bc5b.attr │ │ ├── MBProgressHUD_setLabelText:{instance}.eb03c91339c840d0b4beeb9760edc92b.attr │ │ ├── MBProgressHUD_setMargin:{instance}.cfc61775083906307fab4dba43765fe3.attr │ │ ├── MBProgressHUD_setMinShowTime:{instance}.b813895045aba4190b1dff8f5d44c66a.attr │ │ ├── MBProgressHUD_setMinShowTimer:{instance}.a9259d37b4fb2f215b28ecb3f9e32dcb.attr │ │ ├── MBProgressHUD_setMinSize:{instance}.6b3359b7f53a425979976499c1fe8518.attr │ │ ├── MBProgressHUD_setMode:{instance}.b6d8e4bba9d63bd9c8c932b49b53eb57.attr │ │ ├── MBProgressHUD_setOpacity:{instance}.0d9de659152193a146548de0151ced1f.attr │ │ ├── MBProgressHUD_setRemoveFromSuperViewOnHide:{instance}.bc2e0b23f41236455917c9218b5849e3.attr │ │ ├── MBProgressHUD_setShowStarted:{instance}.5aa5a1f820d62938e64411e5761dcc53.attr │ │ ├── MBProgressHUD_setSquare:{instance}.7cf5d25512eaffea5eec5389f527a2b1.attr │ │ ├── MBProgressHUD_setTaskInProgress:{instance}.41e42d6e6bfdc7e9717af48e96f34cfd.attr │ │ ├── MBProgressHUD_setXOffset:{instance}.b3a146d98d73770b5e2be2b9511ba6d8.attr │ │ ├── MBProgressHUD_setYOffset:{instance}.ea9213ea1fd72c15e521b8926b7a9658.attr │ │ ├── MBProgressHUD_setupLabels{instance}.ea2ff0fb299d03874b01a906a7e5f181.attr │ │ ├── MBProgressHUD_show:{instance}.ac44c85674baa495a162f44dec2bca1f.attr │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:{instance}.cc35373f5b0ef6d67ba0a2cd43d0a077.attr │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:{instance}.5f282b5baff14a6b325db22e8dc79cb5.attr │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:{instance}.939c8bef4c804dcce1a8f8504d065463.attr │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:{instance}.31adcee70bd29a2315f5a590715c3deb.attr │ │ ├── MBProgressHUD_showHUDAddedTo:animated:{class}.a5ee486a46c5d3c99b9e068e9ea4baad.attr │ │ ├── MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be.attr │ │ ├── MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:{instance}.0961e1f2841c54f70f3dc0b695dfc84d.attr │ │ ├── MBProgressHUD_statusBarOrientationDidChange:{instance}.872a47e680449f7f49e472ccf7e9d082.attr │ │ ├── MBProgressHUD_unregisterFromKVO{instance}.bbf3aaf60e868fa0fb966ae29a1af573.attr │ │ ├── MBProgressHUD_unregisterFromNotifications{instance}.de0d4125b86d3858fd69944f1d235402.attr │ │ ├── MBProgressHUD_updateForCurrentOrientationAnimated:{instance}.6fe6a2b1a661f1f307de4fb6a68bd0fb.attr │ │ ├── MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3.attr │ │ ├── MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e.attr │ │ ├── MBProgressHUD_xOffset{instance}.f620c9bf5104d6e75b4f55cf64474cf8.attr │ │ ├── MBProgressHUD_yOffset{instance}.28e4ee28175cb299c29ea4e4a947fe19.attr │ │ ├── MBRoundProgressView_dealloc{instance}.f76e97c78e356529b6d3487d19b1a412.attr │ │ ├── MBRoundProgressView_drawRect:{instance}.5dded631db9e81761adbc52c74e3a158.attr │ │ ├── MBRoundProgressView_initWithFrame:{instance}.202df68ce7c2e37e1d8f93454b69c4d1.attr │ │ ├── MBRoundProgressView_init{instance}.d5141eb9f853d4fabd440a664b453b2f.attr │ │ ├── MBRoundProgressView_observableKeypaths{instance}.88a67d54a2d7175b9b7f5a626393a834.attr │ │ ├── MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.3562ed8d8fbf2b3acfad83fc0f3fcfd0.attr │ │ ├── MBRoundProgressView_progress{instance}.28f5c55b1a3c9926848ed155ecc0b30c.attr │ │ ├── MBRoundProgressView_registerForKVO{instance}.56e6d0e76d20137d6b5a2056d5683113.attr │ │ ├── MBRoundProgressView_setAnnular:{instance}.75a288f0dab258c289396d3bba5ad41f.attr │ │ ├── MBRoundProgressView_setBackgroundTintColor:{instance}.6d3bdc8da5b9cccf361b2fa1341bf906.attr │ │ ├── MBRoundProgressView_setProgressTintColor:{instance}.293e9db9f20e0abe810b75c662e07c81.attr │ │ ├── MBRoundProgressView_unregisterFromKVO{instance}.97841886debac0d49b46482098a4e1d7.attr │ │ ├── MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh{instance}.931b825764944eff97f78ef4c2c44ebd.attr │ │ ├── MJRefreshAutoFooter_isAutomaticallyRefresh{instance}.8faea093d1477159a7d91389f9b8f181.attr │ │ ├── MJRefreshAutoFooter_prepare{instance}.81fdaf533264e53838439b6af78408c2.attr │ │ ├── MJRefreshAutoFooter_scrollViewContentOffsetDidChange:{instance}.bcfcda2745da14825e78d76c540e5ff0.attr │ │ ├── MJRefreshAutoFooter_scrollViewContentSizeDidChange:{instance}.c95f98648e58af09c6bb5f9a39329ee1.attr │ │ ├── MJRefreshAutoFooter_scrollViewPanStateDidChange:{instance}.40aa0d75b89f5a74cf08c78c183d6a19.attr │ │ ├── MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:{instance}.6d7e658eb08c918e2665dda4d02bbe0e.attr │ │ ├── MJRefreshAutoFooter_setAutomaticallyRefresh:{instance}.4fbd2a9064091da8a6df342126079d38.attr │ │ ├── MJRefreshAutoFooter_setHidden:{instance}.8187ea74fc5a524dc007acb5243e7926.attr │ │ ├── MJRefreshAutoFooter_setState:{instance}.bdb3fcb8173fa59cb33dd391730a20c2.attr │ │ ├── MJRefreshAutoFooter_setTriggerAutomaticallyRefreshPercent:{instance}.47b1c6d3dd834c962ca0def11f63773f.attr │ │ ├── MJRefreshAutoFooter_triggerAutomaticallyRefreshPercent{instance}.8e9b83eae28f0dc74a633963546a48c1.attr │ │ ├── MJRefreshAutoFooter_willMoveToSuperview:{instance}.31c9e7668989c017342140f0185c2188.attr │ │ ├── MJRefreshAutoGifFooter_gifView{instance}.4ff145d45d6f0d9ac6a9b37155d3cc66.attr │ │ ├── MJRefreshAutoGifFooter_placeSubviews{instance}.792cabf0aff680ead0baef015354b3be.attr │ │ ├── MJRefreshAutoGifFooter_setImages:duration:forState:{instance}.c46aa256d08ae2ac7749b27d92bed622.attr │ │ ├── MJRefreshAutoGifFooter_setImages:forState:{instance}.bc030fd7ddd4c611d524187d37ba0372.attr │ │ ├── MJRefreshAutoGifFooter_setState:{instance}.ef45940c1ae3cbc92c2bc041ff067afa.attr │ │ ├── MJRefreshAutoGifFooter_setStateDurations:{instance}.8dd71ca577ac65188093d2b9b15487c9.attr │ │ ├── MJRefreshAutoGifFooter_setStateImages:{instance}.7ed1529d6d2d5e64353eef546bc54830.attr │ │ ├── MJRefreshAutoGifFooter_stateDurations{instance}.719f9f19198062078a8a0d9ea201ca6b.attr │ │ ├── MJRefreshAutoGifFooter_stateImages{instance}.ab92380ab4ded17b30f8a08f961ee684.attr │ │ ├── MJRefreshAutoNormalFooter_activityIndicatorViewStyle{instance}.ceb4ca03c0e884815e4fa1da22003b56.attr │ │ ├── MJRefreshAutoNormalFooter_loadingView{instance}.b926a86efa7bdd6b0a6a98c1e90540a4.attr │ │ ├── MJRefreshAutoNormalFooter_placeSubviews{instance}.0f8d74171158ff20387271e6a94777f4.attr │ │ ├── MJRefreshAutoNormalFooter_prepare{instance}.62a05293c68d988c434dbcd79ef0ad7b.attr │ │ ├── MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:{instance}.1740284edf4289989ed9655458e6e541.attr │ │ ├── MJRefreshAutoNormalFooter_setLoadingView:{instance}.fe92ca8e7a1b6d7cce8e8120840765ec.attr │ │ ├── MJRefreshAutoNormalFooter_setState:{instance}.92eb8a4693eb9e978510f5f8e8d079b6.attr │ │ ├── MJRefreshAutoStateFooter_isRefreshingTitleHidden{instance}.07088d8a06b1bab37884b71f7a787511.attr │ │ ├── MJRefreshAutoStateFooter_placeSubviews{instance}.e05bd88dad611fa3f5641cc10cf22caf.attr │ │ ├── MJRefreshAutoStateFooter_prepare{instance}.39111306cd810d7e8289797116b20acc.attr │ │ ├── MJRefreshAutoStateFooter_setState:{instance}.41f13d685c1d0107cac76f5e6cdc6f22.attr │ │ ├── MJRefreshAutoStateFooter_setStateTitles:{instance}.ca2fdfc2466d5604e5ba943c77517474.attr │ │ ├── MJRefreshAutoStateFooter_setTitle:forState:{instance}.a6f426bbeb7cb198331cbcece4cf4ec0.attr │ │ ├── MJRefreshAutoStateFooter_stateLabelClick{instance}.8d69ce4f9c38bcef0e235e719a0ddbdf.attr │ │ ├── MJRefreshAutoStateFooter_stateLabel{instance}.0d1656cd91316c5fef17b9f5de691d6b.attr │ │ ├── MJRefreshAutoStateFooter_stateTitles{instance}.45df57b523fb4f840f1c9d536a35d61c.attr │ │ ├── MJRefreshBackFooter_endRefreshing{instance}.958680d523a94ab59c1c9601c2541ab2.attr │ │ ├── MJRefreshBackFooter_happenOffsetY{instance}.0dae9169061683402ab2798299f74adc.attr │ │ ├── MJRefreshBackFooter_heightForContentBreakView{instance}.6c28d740d05c68bd5806d8010e497a29.attr │ │ ├── MJRefreshBackFooter_lastBottomDelta{instance}.c496b2fb23a0b6abb0536952369a6067.attr │ │ ├── MJRefreshBackFooter_lastRefreshCount{instance}.d98b9dfc2f5608eb90069f4a99ccb939.attr │ │ ├── MJRefreshBackFooter_noticeNoMoreData{instance}.83d8a6971a587c2fe5193c2bc7f4b031.attr │ │ ├── MJRefreshBackFooter_scrollViewContentOffsetDidChange:{instance}.f883c7a60628c818fb9a69ebcf62f187.attr │ │ ├── MJRefreshBackFooter_scrollViewContentSizeDidChange:{instance}.665d5ffac44fdda6b0cfcaf9f76338c2.attr │ │ ├── MJRefreshBackFooter_setLastBottomDelta:{instance}.d7f17dc59f26de4e40fdddac33e09d55.attr │ │ ├── MJRefreshBackFooter_setLastRefreshCount:{instance}.6ba2ed2e1c21a669ddd4b81d419bf540.attr │ │ ├── MJRefreshBackFooter_setState:{instance}.2a84f32e6c9d600cfa0c5f9c490fa00b.attr │ │ ├── MJRefreshBackFooter_willMoveToSuperview:{instance}.5dcec01faa2292110b1de8e64a12c539.attr │ │ ├── MJRefreshBackGifFooter_gifView{instance}.7c4a05bcc8f049050cffa895709f2611.attr │ │ ├── MJRefreshBackGifFooter_placeSubviews{instance}.1cf5a34d6185752d129aad4c43b0cf42.attr │ │ ├── MJRefreshBackGifFooter_setImages:duration:forState:{instance}.bd185713fbda471cfa0b26d0475db1d6.attr │ │ ├── MJRefreshBackGifFooter_setImages:forState:{instance}.f959fd72b4774da01ea194a4b34ee359.attr │ │ ├── MJRefreshBackGifFooter_setPullingPercent:{instance}.157a977e4c33fa60e38cb624a19f24de.attr │ │ ├── MJRefreshBackGifFooter_setState:{instance}.fa1a5e8a04db08dde17ff7de59c16477.attr │ │ ├── MJRefreshBackGifFooter_setStateDurations:{instance}.a81609e641136283d141a5292c789277.attr │ │ ├── MJRefreshBackGifFooter_setStateImages:{instance}.0f098236eda9a4915e3507a899e4a6b4.attr │ │ ├── MJRefreshBackGifFooter_stateDurations{instance}.ecff20c8de39266ddc0f975a0f4306e2.attr │ │ ├── MJRefreshBackGifFooter_stateImages{instance}.724b5260dc41e21938f90f2360672187.attr │ │ ├── MJRefreshBackNormalFooter_activityIndicatorViewStyle{instance}.960a7ee908a4fd7a48491e0e03139820.attr │ │ ├── MJRefreshBackNormalFooter_arrowView{instance}.4311ef7cafa4a9ee91bbac226b717da9.attr │ │ ├── MJRefreshBackNormalFooter_loadingView{instance}.d862d1537eaf4f13b3ea928a9d7e6bb2.attr │ │ ├── MJRefreshBackNormalFooter_placeSubviews{instance}.14a691c735954cea598f1c42945a8ade.attr │ │ ├── MJRefreshBackNormalFooter_prepare{instance}.d348875f78d00052355c482b471988da.attr │ │ ├── MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:{instance}.c11249674bf6ed2701a1780e8cf790ae.attr │ │ ├── MJRefreshBackNormalFooter_setLoadingView:{instance}.a44b93d20344678374d94ba20c30fb29.attr │ │ ├── MJRefreshBackNormalFooter_setState:{instance}.bfb37954287cc1242b9371c8e0c2c53d.attr │ │ ├── MJRefreshBackStateFooter_placeSubviews{instance}.07dd32534b9ae4810921764ceac1540a.attr │ │ ├── MJRefreshBackStateFooter_prepare{instance}.e12b6d29ae7cc426b54f69331c789d15.attr │ │ ├── MJRefreshBackStateFooter_setState:{instance}.0ffb3dd66c48270735110933d1f2f0d7.attr │ │ ├── MJRefreshBackStateFooter_setStateTitles:{instance}.2cbd1f0a4076406931cad7c161e143f3.attr │ │ ├── MJRefreshBackStateFooter_setTitle:forState:{instance}.e6265b339a82b1b962fd6b7d372b38b4.attr │ │ ├── MJRefreshBackStateFooter_stateLabel{instance}.671bdcb3c3052ca29a0160eca1c6b6bd.attr │ │ ├── MJRefreshBackStateFooter_stateTitles{instance}.8c8d015f558a5b782cef16fa2a872de2.attr │ │ ├── MJRefreshBackStateFooter_titleForState:{instance}.6644d0fcdc32801821696c2a4d6f0aa8.attr │ │ ├── MJRefreshComponent_addObservers{instance}.48ac3cc9007a3c8cbb6a15277c7db9ea.attr │ │ ├── MJRefreshComponent_beginRefreshing{instance}.37e3b4491c03ca5070562df652ae4a3f.attr │ │ ├── MJRefreshComponent_drawRect:{instance}.5c9569babdce7fbc05fdb15778362755.attr │ │ ├── MJRefreshComponent_endRefreshing{instance}.2720081dcaca1ee01ca4ba03255da838.attr │ │ ├── MJRefreshComponent_executeRefreshingCallback{instance}.4f282c4379c6e540d10c12e54d80e390.attr │ │ ├── MJRefreshComponent_initWithFrame:{instance}.dcc5043bc9d4cc86799bf33ff4f78bb3.attr │ │ ├── MJRefreshComponent_isAutoChangeAlpha{instance}.d2580facd9584f5d1823586225276c0c.attr │ │ ├── MJRefreshComponent_isAutomaticallyChangeAlpha{instance}.2a8e6128dc3b7f4056d44eb6a85dcbc0.attr │ │ ├── MJRefreshComponent_isRefreshing{instance}.a3d1e918912f39baa99b419848f9d33b.attr │ │ ├── MJRefreshComponent_layoutSubviews{instance}.8098590c7287f2a2c27bd59d78a0452b.attr │ │ ├── MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:{instance}.5c79a9157e694b8877729d29e6accd4f.attr │ │ ├── MJRefreshComponent_pan{instance}.b4b8604d2765baa120b9f835149bfa11.attr │ │ ├── MJRefreshComponent_placeSubviews{instance}.73d06208ee35f85eb9d849aecd472416.attr │ │ ├── MJRefreshComponent_prepare{instance}.38440e789285bd7781f72155c89e3f5a.attr │ │ ├── MJRefreshComponent_pullingPercent{instance}.bf3ec592754e2b06a9c418a8a42e64d1.attr │ │ ├── MJRefreshComponent_refreshingAction{instance}.c143d0e5740c72c171ef233926e1a636.attr │ │ ├── MJRefreshComponent_refreshingBlock{instance}.69fd8a712aee96a73b3b1907bd80645a.attr │ │ ├── MJRefreshComponent_refreshingTarget{instance}.3ad49532b05a7ff9e99f62f13f0120a0.attr │ │ ├── MJRefreshComponent_removeObservers{instance}.c9d911e52f725b43fc7b34f4a07b3923.attr │ │ ├── MJRefreshComponent_scrollViewContentOffsetDidChange:{instance}.617caa7f28422a6417560a602082f5b8.attr │ │ ├── MJRefreshComponent_scrollViewContentSizeDidChange:{instance}.e16f83d0096447be3224827fc19b9549.attr │ │ ├── MJRefreshComponent_scrollViewOriginalInset{instance}.d960bf16dffbba6c5ce59ac62c5b4fb4.attr │ │ ├── MJRefreshComponent_scrollViewPanStateDidChange:{instance}.d34301c5662a55086b39dd2ec566b5ad.attr │ │ ├── MJRefreshComponent_scrollView{instance}.b68a4e9c5b6d215896d41cfbac4d856c.attr │ │ ├── MJRefreshComponent_setAutoChangeAlpha:{instance}.a04c05493fc5ecf43d98b9924f8bc78c.attr │ │ ├── MJRefreshComponent_setAutomaticallyChangeAlpha:{instance}.4591244e561c565e45c21b89ff9610d4.attr │ │ ├── MJRefreshComponent_setPan:{instance}.8c82f9c37018718627c17f27fd904e9a.attr │ │ ├── MJRefreshComponent_setPullingPercent:{instance}.5755356ca5ccb563f50c75bba6db1e9d.attr │ │ ├── MJRefreshComponent_setRefreshingAction:{instance}.bad58c3b51021489ca89cb2811c78f1d.attr │ │ ├── MJRefreshComponent_setRefreshingBlock:{instance}.90e035f5c7d64addfbae505ffc8b7a66.attr │ │ ├── MJRefreshComponent_setRefreshingTarget:refreshingAction:{instance}.d064af6f306c53b4158833f0f020408a.attr │ │ ├── MJRefreshComponent_setRefreshingTarget:{instance}.afb8262211db09c8108307aa294d217f.attr │ │ ├── MJRefreshComponent_setState:{instance}.f0480dd1ccaad27d029386c5ed7a1483.attr │ │ ├── MJRefreshComponent_state{instance}.3e10ee4b41ed83680cb31b6bea5d1de9.attr │ │ ├── MJRefreshComponent_willMoveToSuperview:{instance}.7f13a46585df11309a3efe2ded73b3e8.attr │ │ ├── MJRefreshFooter_endRefreshingWithNoMoreData{instance}.7cebeaf3e25d576c2293600605c1d5dd.attr │ │ ├── MJRefreshFooter_footerWithRefreshingBlock:{class}.7b0806c0686d1afa44b5fed238c938ea.attr │ │ ├── MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:{class}.1e0bbbdfa84d1cb2fec223b55831736b.attr │ │ ├── MJRefreshFooter_ignoredScrollViewContentInsetBottom{instance}.bd00196e69f4c011b59698fe4d2a578d.attr │ │ ├── MJRefreshFooter_isAutomaticallyHidden{instance}.539b1a347be7479872b339b540520f84.attr │ │ ├── MJRefreshFooter_noticeNoMoreData{instance}.494f0af619d71dbb29db8dfc8f282251.attr │ │ ├── MJRefreshFooter_prepare{instance}.ddd00b0bdc007d8acb701df2df7655ca.attr │ │ ├── MJRefreshFooter_resetNoMoreData{instance}.b274245415c7498741c88078022d456f.attr │ │ ├── MJRefreshFooter_setAutomaticallyHidden:{instance}.7f162ef8d8c58276b815aef7bde84b8d.attr │ │ ├── MJRefreshFooter_willMoveToSuperview:{instance}.3e71353e4d67175789d2dd970e67fd37.attr │ │ ├── MJRefreshGifHeader_gifView{instance}.f27c0323d39ba73d7475591753b0d820.attr │ │ ├── MJRefreshGifHeader_placeSubviews{instance}.3b12f3d808f6e873748f71aeeae3b0eb.attr │ │ ├── MJRefreshGifHeader_setImages:duration:forState:{instance}.c9ff89babbdd988caa30a42380238d0f.attr │ │ ├── MJRefreshGifHeader_setImages:forState:{instance}.eedc47d9f24c22cecd1d33d19b2da587.attr │ │ ├── MJRefreshGifHeader_setPullingPercent:{instance}.09714a93b584cd6ad3c07c560b76c445.attr │ │ ├── MJRefreshGifHeader_setState:{instance}.81dabe1e4914cef626e0420acceaa1fa.attr │ │ ├── MJRefreshGifHeader_setStateDurations:{instance}.cb90550e9c001b7d22445dff685c9b49.attr │ │ ├── MJRefreshGifHeader_setStateImages:{instance}.217cdc2960d0cb5cfa9a2e4ae4d09020.attr │ │ ├── MJRefreshGifHeader_stateDurations{instance}.ee55fb0d6525e622971f502c74682d20.attr │ │ ├── MJRefreshGifHeader_stateImages{instance}.c45aa4d25429518b434a1b8d924d07b3.attr │ │ ├── MJRefreshHeader_drawRect:{instance}.c3e57b4a302b533c30bf09ca94992915.attr │ │ ├── MJRefreshHeader_endRefreshing{instance}.fb3fecfe4e2f8b20f48a86c39ec8d2c8.attr │ │ ├── MJRefreshHeader_headerWithRefreshingBlock:{class}.86bd7d9042726fde59582daf33cccd26.attr │ │ ├── MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:{class}.38704964b164af751351ca0df311361c.attr │ │ ├── MJRefreshHeader_ignoredScrollViewContentInsetTop{instance}.99e38b0442fb57279fcf578ee0856f11.attr │ │ ├── MJRefreshHeader_insetTDelta{instance}.f1d969234e8c5d3b96269951bbbaa1ed.attr │ │ ├── MJRefreshHeader_lastUpdatedTimeKey{instance}.736b450172ca1b7659d372d44199258c.attr │ │ ├── MJRefreshHeader_lastUpdatedTime{instance}.2a89276f34032f5c83485ead73d73c79.attr │ │ ├── MJRefreshHeader_placeSubviews{instance}.1feae4d44bd11e658f4aca7d5d6cc6cb.attr │ │ ├── MJRefreshHeader_prepare{instance}.f8820581ac423aeb157abb616851572d.attr │ │ ├── MJRefreshHeader_scrollViewContentOffsetDidChange:{instance}.052321827b6bd024a37e6ccf4c6f5eaa.attr │ │ ├── MJRefreshHeader_setInsetTDelta:{instance}.5d742f6f339f68a1f87cf30bc1161584.attr │ │ ├── MJRefreshHeader_setLastUpdatedTimeKey:{instance}.cf5e73d71d6aa690207f374bade9c3be.attr │ │ ├── MJRefreshHeader_setState:{instance}.613dbd07b62ad0844ea350e1c213bfec.attr │ │ ├── MJRefreshNormalHeader_activityIndicatorViewStyle{instance}.5c09ef3cfb75bbb7a06ebd6bfd64b069.attr │ │ ├── MJRefreshNormalHeader_arrowView{instance}.3c9cde775fac361e9e6fbd5ed8ee6d86.attr │ │ ├── MJRefreshNormalHeader_loadingView{instance}.bac4283eefad58aa66ec42809991591a.attr │ │ ├── MJRefreshNormalHeader_placeSubviews{instance}.1637f8c1509d5ff960a7ee2b01a93543.attr │ │ ├── MJRefreshNormalHeader_prepare{instance}.c5161195985077e841f425b250b31545.attr │ │ ├── MJRefreshNormalHeader_setActivityIndicatorViewStyle:{instance}.f54ee85457d5aef8dcad8becafed4dbe.attr │ │ ├── MJRefreshNormalHeader_setLoadingView:{instance}.008c3e796908f69ecfe7554e5d5d05bf.attr │ │ ├── MJRefreshNormalHeader_setState:{instance}.cf4cc9b8ba9cb613d7b7656d100e6a5c.attr │ │ ├── MJRefreshStateHeader_currentCalendar{instance}.8a5d265e54d2287dcf9ab73daf03a0db.attr │ │ ├── MJRefreshStateHeader_lastUpdatedTimeLabel{instance}.39c3adf46f0e72fe1ca7bdb144690d58.attr │ │ ├── MJRefreshStateHeader_lastUpdatedTimeText{instance}.fea5b80b2c312ffc0724847799055792.attr │ │ ├── MJRefreshStateHeader_placeSubviews{instance}.3551b50672d8958430e0714f4a86608a.attr │ │ ├── MJRefreshStateHeader_prepare{instance}.f22a66a2819564c00d25b26a8008dc49.attr │ │ ├── MJRefreshStateHeader_setLastUpdatedTimeKey:{instance}.49b3e932b043bc723eadea72e523c08a.attr │ │ ├── MJRefreshStateHeader_setState:{instance}.9e5202b000baef8593570a086f6041cc.attr │ │ ├── MJRefreshStateHeader_setStateTitles:{instance}.4b4f630c8af3e6c520900e530b6c9ae3.attr │ │ ├── MJRefreshStateHeader_setTitle:forState:{instance}.7245f932111276c34a890fcd85654763.attr │ │ ├── MJRefreshStateHeader_stateLabel{instance}.0d68c4cd4f8dbfeb7f2359f4d961670f.attr │ │ ├── MJRefreshStateHeader_stateTitles{instance}.38ba9a44aa4289fe8e20bd9863f71a73.attr │ │ ├── NSArray_arrayWithArray:{class}.73f5cb7c9141d67fe274805a736dc06e.attr │ │ ├── NSArray_arrayWithObjects:{class}.46b7a97f9f82af16db819040ffbc6603.attr │ │ ├── NSArray_array{class}.5a4c6dc6cba477ecd82af04178b5f4a0.attr │ │ ├── NSArray_count{instance}.0f9e592ac8b06ac1a4812f56dc101f92.attr │ │ ├── NSArray_firstObject{instance}.0dac2e2203b47615244e42ddad98a5f3.attr │ │ ├── NSArray_lastObject{instance}.4e2e110e52d16989fb6cb503ef918b3c.attr │ │ ├── NSArray_nextObject{instance}.905860e33a13a5c1c2b249d0d5af276f.attr │ │ ├── NSArray_objectAtIndex:{instance}.c3cbf46405a13796ce7b5e1d8abd77da.attr │ │ ├── NSArray_objectAtIndexedSubscript:{instance}.6183d087c46b327219d51c99baba2644.attr │ │ ├── NSArray_reverseObjectEnumerator{instance}.12852ddfee3dc490afb9c870b6d9170a.attr │ │ ├── NSAssertionHandler_currentHandler{class}.d6e3a736ec59e36423f239e0912fca50.attr │ │ ├── NSAttributedString_initWithString:attributes:{instance}.b2a1c2be8262fb402ba1226f32dccbfa.attr │ │ ├── NSAttributedString_size{instance}.4c91b9dd838acfca4e9d11510dbc48f9.attr │ │ ├── NSCalendar_calendarWithIdentifier:{class}.56be867910b3643d840f3d908fc520dd.attr │ │ ├── NSCalendar_components:fromDate:{instance}.878c2f8f9773a68b1749285e5f8e3c57.attr │ │ ├── NSCalendar_currentCalendar{class}.2feb2436d3331c83e256a47a9598da37.attr │ │ ├── NSDateComponents_day{instance}.0cc152f755ea10345c10d6ab173818f7.attr │ │ ├── NSDateComponents_year{instance}.135dd79c9a528bb28e42248f13b509cc.attr │ │ ├── NSDateFormatter_setDateFormat:{instance}.a70dbd598b901160fb88ec02d8f41a4c.attr │ │ ├── NSDateFormatter_stringFromDate:{instance}.7c386ab69e42be73312e58a382628e26.attr │ │ ├── NSDate_date{class}.3d31718970bc6b1329ef1b1edcc8276d.attr │ │ ├── NSDate_timeIntervalSinceDate:{instance}.3f0066dd0493c4cc0866d3d7d57c29cb.attr │ │ ├── NSDictionary___objc_dictionary_literal:{class}.2cc6bfd9e03a972257568194f9e67021.attr │ │ ├── NSDictionary_dictionaryWithDictionary:{class}.cd7e53733b5fda00c29543190f2dab25.attr │ │ ├── NSDictionary_dictionary{class}.e338f0f034113194542b33e53b663edf.attr │ │ ├── NSDictionary_initWithObjectsAndKeys:{instance}.bfa3685ce08fed831cbb944ba40821d0.attr │ │ ├── NSDictionary_objectForKeyedSubscript:{instance}.9dedd7e44ab6ec6a9718a528470b227d.attr │ │ ├── NSEnumerator_nextObject{instance}.0322b08da1588005f42f65c59a81703b.attr │ │ ├── NSException_raise:format:{class}.c218a1c123623778144013ca4b657f12.attr │ │ ├── NSMutableArray_addObject:{instance}.5da7801d846b260275d13172e4fd833f.attr │ │ ├── NSMutableDictionary_addEntriesFromDictionary:{instance}.14013431c33fe375a8455569b3466326.attr │ │ ├── NSMutableDictionary_setObject:forKeyedSubscript:{instance}.88e167e2bb625b70bc6f6c0a42668a23.attr │ │ ├── NSNotificationCenter_addObserver:selector:name:object:{instance}.d8590a494e2626ba1d737df9df98e4db.attr │ │ ├── NSNotificationCenter_defaultCenter{class}.4f7c3cb78df6c66860599cda99ac8b8e.attr │ │ ├── NSNotificationCenter_removeObserver:name:object:{instance}.76a492e0632b48f2ba9ac28c0affcc30.attr │ │ ├── NSNull_null{class}.4cdc12943af510da40c0a0c27e47e0f0.attr │ │ ├── NSNumber_boolValue{instance}.e4893df39cae4a256f2380575788be54.attr │ │ ├── NSNumber_floatValue{instance}.84fcbed74c16528537b3ea5efc31b740.attr │ │ ├── NSNumber_numberWithBool:{class}.f2deb31f15437b8867202d7ed0d8f349.attr │ │ ├── NSNumber_numberWithDouble:{class}.2f131d3300739acd32e1b7a585149f88.attr │ │ ├── NSNumber_numberWithFloat:{class}.94fb77dd79b333aaed1a5f016be662d9.attr │ │ ├── NSNumber_numberWithInteger:{class}.3038ee3633f763bed71abfbfdc809f6e.attr │ │ ├── NSObject_addObserver:forKeyPath:options:context:{instance}.128bb4105c9090708dbbbab2f2ca6b2a.attr │ │ ├── NSObject_awakeFromNib{instance}.7f4a69fcaef89cd61de6a10cbca6763d.attr │ │ ├── NSObject_cancelPreviousPerformRequestsWithTarget:{class}.8f9c67f6629bf621b978bc97bffcad31.attr │ │ ├── NSObject_copy{instance}.580600ed244fca5c057f9989b248eca2.attr │ │ ├── NSObject_didChangeValueForKey:{instance}.8adfe9d247985ab2cfb5ff06b13dff1a.attr │ │ ├── NSObject_exchangeClassMethod1:method2:{class}.71d689a434ca09b8cb8f74bbec7f4eb5.attr │ │ ├── NSObject_exchangeInstanceMethod1:method2:{class}.96dfacd3a3ff34cf35523d85905b2d24.attr │ │ ├── NSObject_init{instance}.a9cbb5363d8c7a60d726fbff19001bf9.attr │ │ ├── NSObject_isKindOfClass:{instance}.757d2e3904bfd44b044e734bfc4139a5.attr │ │ ├── NSObject_performSelector:withObject:afterDelay:{instance}.be441d6c4c6bbe45bc39bb0a6f13a3e4.attr │ │ ├── NSObject_performSelectorOnMainThread:withObject:waitUntilDone:{instance}.c04af645454fffffe2b35e80847de072.attr │ │ ├── NSObject_removeObserver:forKeyPath:{instance}.d01714f3860a2ea0b2b5d61be80c45d1.attr │ │ ├── NSObject_respondsToSelector:{instance}.1f130cc6d2f85e175c04db8e1caf0088.attr │ │ ├── NSObject_valueForKeyPath:{instance}.121d4741c9cda1c7173b9bdc4a4163e6.attr │ │ ├── NSObject_willChangeValueForKey:{instance}.e5bccbb6868b934c9411a6308d4ab574.attr │ │ ├── NSRunLoop_addTimer:forMode:{instance}.1bcdd94e70af8c43e1d4402566833994.attr │ │ ├── NSRunLoop_currentRunLoop{class}.065a7a5dbd7cef74f9536194dcb90aef.attr │ │ ├── NSSet_anyObject{instance}.af7cec527f1fd27dcf9e0471109fd643.attr │ │ ├── NSString_boundingRectWithSize:options:attributes:context:{instance}.2df85a2d3dc840f02c1e25e051b0c64d.attr │ │ ├── NSString_isEqualToString:{instance}.dec2551d2b640c984af1dcbb0bbc09bf.attr │ │ ├── NSString_length{instance}.a8a4fc57e4b1be8ff5e74267bacb5a39.attr │ │ ├── NSString_sizeWithAttributes:{instance}.bb0ef614f8af1bf78f0643f823f7f825.attr │ │ ├── NSString_stringByAppendingPathComponent:{instance}.0d669413fdefb3ee003b28c2e8c98c97.attr │ │ ├── NSString_stringWithFormat:{class}.0c23bd53945e16ff03395a53fad2c613.attr │ │ ├── NSString_stringWithUTF8String:{class}.a244cdea666ec44c14a50b4e35422a5a.attr │ │ ├── NSThread_detachNewThreadSelector:toTarget:withObject:{class}.ea7c7a072ac4ebb1739d38149cd67ce3.attr │ │ ├── NSThread_isMainThread{class}.8a097307ec61e16f1d9aca8957b34c27.attr │ │ ├── NSTimer_scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:{class}.7e0dd39eae48ecdcf7e5a4dfd8c1a8ab.attr │ │ ├── NSTimer_timerWithTimeInterval:target:selector:userInfo:repeats:{class}.ba6152c08738512cf1d8d3ed23f91a5f.attr │ │ ├── NSUserDefaults_objectForKey:{instance}.6a736c858820440b9fb7e7bb989e29ca.attr │ │ ├── NSUserDefaults_setObject:forKey:{instance}.5e04418fd217107d46c5ee4a927e2950.attr │ │ ├── NSUserDefaults_standardUserDefaults{class}.8586e9dd0243e961e456b72f0e385088.attr │ │ ├── NSUserDefaults_synchronize{instance}.566cee594928cff507a4b361d331eb65.attr │ │ ├── UIActivityIndicatorView_initWithActivityIndicatorStyle:{instance}.686b39dbd6130831f4f596a496925229.attr │ │ ├── UIActivityIndicatorView_setColor:{instance}.631d527193bd37f518c551d94f783091.attr │ │ ├── UIActivityIndicatorView_setHidesWhenStopped:{instance}.5a63bb51473681194292c1f220b1e850.attr │ │ ├── UIActivityIndicatorView_startAnimating{instance}.726b2a8146ee530895e73bd14a9ca02e.attr │ │ ├── UIActivityIndicatorView_stopAnimating{instance}.762f63490221703422041e428618707d.attr │ │ ├── UIBezierPath_CGPath{instance}.a445b02f43b2a23c22ee800024b5cbab.attr │ │ ├── UIBezierPath_addArcWithCenter:radius:startAngle:endAngle:clockwise:{instance}.e3553dfdf35173592b926fdb144cd888.attr │ │ ├── UIBezierPath_addLineToPoint:{instance}.3517513044772845e4d9e6445f8867d9.attr │ │ ├── UIBezierPath_bezierPath{class}.7f9ae66976a90eaf739696c997fe9fc9.attr │ │ ├── UIBezierPath_closePath{instance}.be9df4ae3c60793ff53f707c8224c555.attr │ │ ├── UIBezierPath_moveToPoint:{instance}.c79bfbd33abb9a5389cc40da6796073d.attr │ │ ├── UIBezierPath_setLineCapStyle:{instance}.9e889c2a613ffd858e579dbf69bc1324.attr │ │ ├── UIBezierPath_setLineWidth:{instance}.88b9a75ad8d9dfcd01048acb45b97d12.attr │ │ ├── UIBezierPath_stroke{instance}.29a9f86895dc451dacc08f9383ceb210.attr │ │ ├── UICollectionView_exchangeInstanceMethod1:method2:{class}.8f3805d0d4c7e406484eb6c46768b9e9.attr │ │ ├── UICollectionView_load{class}.d1e03b913041c5304ea6e6aaae62516c.attr │ │ ├── UICollectionView_mj_reloadData{instance}.9bef8e95c2259d92fdae989582bb1f01.attr │ │ ├── UICollectionView_numberOfItemsInSection:{instance}.2205eeefdaf761dd5195364e3bdbee69.attr │ │ ├── UICollectionView_numberOfSections{instance}.fc89bcbc428c0e925c8e719b344b5ca9.attr │ │ ├── UIColor_CGColor{instance}.f5ecbc4894a012cb3b4a04efa282c7b7.attr │ │ ├── UIColor_blackColor{class}.46ede24821f1f2d54f006111646d26fa.attr │ │ ├── UIColor_clearColor{class}.25d7256e95f6af4d2c0861039007243f.attr │ │ ├── UIColor_colorWithAlphaComponent:{instance}.dd512154e7f94f56b56e00b6e2d443b6.attr │ │ ├── UIColor_colorWithRed:green:blue:alpha:{class}.64a6f7ddc1864ad6e93df9a14cd41d82.attr │ │ ├── UIColor_initWithWhite:alpha:{instance}.ea873fd63315c61c4099c75a94879989.attr │ │ ├── UIColor_setFill{instance}.5fa3c963e716d90c8a63be7ffeea2c2f.attr │ │ ├── UIColor_setStroke{instance}.1e8c957c23295bc168bee3e09efe3d17.attr │ │ ├── UIColor_set{instance}.d7a24e329074be7deaa76154b826ed83.attr │ │ ├── UIColor_whiteColor{class}.9b53921418410c49c69a221d4b6e51cd.attr │ │ ├── UIControl_sendActionsForControlEvents:{instance}.7ab324ce1f2330b7bf5f623fd4ade166.attr │ │ ├── UIEdgeInsetsMake{705028a55d4fee0bbc295b270638c368}.f40f0a913c04ca8641baa16af33549b2.attr │ │ ├── UIFont_boldSystemFontOfSize:{class}.6108f1febb9408b875a34c06ed122b7a.attr │ │ ├── UIFont_systemFontOfSize:{class}.9b318e42bf117f3a5a0bfaa19275a53d.attr │ │ ├── UIGestureRecognizer_initWithTarget:action:{instance}.d20213482c0d76613243d4599a25e3b0.attr │ │ ├── UIGestureRecognizer_state{instance}.72d3b4528beba9fed05f1ae9f3a094ea.attr │ │ ├── UIGraphicsGetCurrentContext.009d5161ebfaed78bdca47d702bc6418.attr │ │ ├── UIGraphicsPopContext.0928809562c91cf79a57a329e7e9a4ad.attr │ │ ├── UIGraphicsPushContext.e73809d88e498128f47750f2c68fb132.attr │ │ ├── UIImageView_image{instance}.e6b6b82ede62a75b05f9e95e34ad1d7a.attr │ │ ├── UIImageView_initWithImage:{instance}.018262108f526bf12f9ade60d5fbe567.attr │ │ ├── UIImageView_setAnimationDuration:{instance}.a74491675b3119c5d2de2242230e0df2.attr │ │ ├── UIImageView_setAnimationImages:{instance}.61e950b1fd0d052dc20a5e3e9ef151a0.attr │ │ ├── UIImageView_setImage:{instance}.c627e5b9b438d458859cf58d0a2e81f8.attr │ │ ├── UIImageView_startAnimating{instance}.c464c413b7b3333652b8115b1afdacb8.attr │ │ ├── UIImageView_stopAnimating{instance}.e5b07b7994b0cc7ed263f16c3c656d50.attr │ │ ├── UIImage_CGImage{instance}.a9dc7f3473cf1a1d874d869a22c88c49.attr │ │ ├── UIImage_imageNamed:{class}.e8c6d5f00a6eeef0fa342fd5065b6979.attr │ │ ├── UIImage_size{instance}.278a524c30a719737b5502caa26a9cab.attr │ │ ├── UILabel_font{instance}.65291af887b5b39270095e2fc5445e28.attr │ │ ├── UILabel_label{class}.afa07640ba686955a2a7362d25bc45b7.attr │ │ ├── UILabel_setAdjustsFontSizeToFitWidth:{instance}.98c95f6466e382b4da1bac6936f2def2.attr │ │ ├── UILabel_setFont:{instance}.605d4c00f146c7ba4aabc2fee3e4367f.attr │ │ ├── UILabel_setNumberOfLines:{instance}.92a9c34957d9852ce38bf7dbf0b20922.attr │ │ ├── UILabel_setText:{instance}.abe14bc97d99fda5d472956538c9383a.attr │ │ ├── UILabel_setTextAlignment:{instance}.4908bb9cf71a2c7c85bd19545b76c727.attr │ │ ├── UILabel_setTextColor:{instance}.caae9447da5a175b8206e83c00953f82.attr │ │ ├── UILabel_setUserInteractionEnabled:{instance}.c2d339af2fc5dd453d8cd9de654707be.attr │ │ ├── UILabel_text{instance}.35fc1826e3b0ff188d9eee1358b317d1.attr │ │ ├── UIRectFill.3d2c0ca4b41800cd9c278779a94d31eb.attr │ │ ├── UIResponder_nextResponder{instance}.cd790ed750397388a1867a17022e0b1d.attr │ │ ├── UIResponder_touchesBegan:withEvent:{instance}.cb347b9b9b9cddc7da875ff9a9beb3e2.attr │ │ ├── UIResponder_touchesEnded:withEvent:{instance}.597eb0f7e280ba0732deb6f9c273c728.attr │ │ ├── UIResponder_touchesMoved:withEvent:{instance}.b8debe8a7558c7089892858ca8322ad0.attr │ │ ├── UIScreen_mainScreen{class}.934832fad1215042efad457357d981e7.attr │ │ ├── UIScreen_scale{instance}.37770ea77184b324005e335c80f21931.attr │ │ ├── UIScrollView_contentInset{instance}.809545d6ddbddcfa01bc8d96bf05ce5c.attr │ │ ├── UIScrollView_contentOffset{instance}.03a66915b30c9c364c50eba29a2c5ba9.attr │ │ ├── UIScrollView_contentSize{instance}.7c944fb1ab90ddc3b94bb328d9e64ab7.attr │ │ ├── UIScrollView_executeReloadDataBlock{instance}.2ca85f7effafbea15ae2c2975b285598.attr │ │ ├── UIScrollView_footer{instance}.8fce697ac57901aefeb1dacc2f5a47fb.attr │ │ ├── UIScrollView_header{instance}.e36f42d4e2603c64553db7a0edc46a00.attr │ │ ├── UIScrollView_isDragging{instance}.7133375b2bcf4d6809489e19e834beff.attr │ │ ├── UIScrollView_mj_contentH{instance}.24036d4daf4502909755d50e306cf8aa.attr │ │ ├── UIScrollView_mj_contentW{instance}.b233414ab82901bfa5e9c481f02eed57.attr │ │ ├── UIScrollView_mj_footer{instance}.ba19ff126339a1f9cc565424123dd04a.attr │ │ ├── UIScrollView_mj_header{instance}.de4dca3362b06a6fcebf0d4f8ea6605d.attr │ │ ├── UIScrollView_mj_insetB{instance}.027c674f176050465f25d28555c82310.attr │ │ ├── UIScrollView_mj_insetL{instance}.69019a4b689dc5e9480034298613a0c4.attr │ │ ├── UIScrollView_mj_insetR{instance}.8115b31217137fcbfb89f6bc0a2b4fbb.attr │ │ ├── UIScrollView_mj_insetT{instance}.dac71a98dc5d026ebd267231dbdea13e.attr │ │ ├── UIScrollView_mj_offsetX{instance}.add36016215f1fb4cf2e3cdb7c52da44.attr │ │ ├── UIScrollView_mj_offsetY{instance}.d3262116c9f7c7ee5e0b4e48645e0584.attr │ │ ├── UIScrollView_mj_reloadDataBlock{instance}.768a89e8546301059a84c1fcc484d254.attr │ │ ├── UIScrollView_mj_totalDataCount{instance}.6c960100dbafbe2ab276237e1d1d821d.attr │ │ ├── UIScrollView_panGestureRecognizer{instance}.1de5fbb878e0815eb4316f32991830bd.attr │ │ ├── UIScrollView_scrollRectToVisible:animated:{instance}.b010a37e6e0d5f49efb0134761bf7f90.attr │ │ ├── UIScrollView_setAlwaysBounceVertical:{instance}.ad65d80697dd4c7d83b60ccc779f1492.attr │ │ ├── UIScrollView_setContentInset:{instance}.f5f5bf643ed22f851f9a5c1d69b643bf.attr │ │ ├── UIScrollView_setContentOffset:{instance}.c7c935e6eefcb263db577dcf6fe585d7.attr │ │ ├── UIScrollView_setContentSize:{instance}.9e194cc3b6f4c11cc984e7b204b1fe32.attr │ │ ├── UIScrollView_setFooter:{instance}.228b084c44c3768d2822fc3e5ea603c3.attr │ │ ├── UIScrollView_setHeader:{instance}.0e813252b26bad8d7194457a9c6ba149.attr │ │ ├── UIScrollView_setMj_contentH:{instance}.834d14f06ceb43250beab703d0ccfc0a.attr │ │ ├── UIScrollView_setMj_contentW:{instance}.e5a6e3a2cd405961dfb5c0d27d352b8d.attr │ │ ├── UIScrollView_setMj_footer:{instance}.2cd77804053e8f9f52d938b68b3a588d.attr │ │ ├── UIScrollView_setMj_header:{instance}.bd1cfdba85638094043a7255cd38d0ea.attr │ │ ├── UIScrollView_setMj_insetB:{instance}.5a71cb186a3ec20d90f8bd47b9dac47d.attr │ │ ├── UIScrollView_setMj_insetL:{instance}.e64529e7d174d17a7bec9ddea732217e.attr │ │ ├── UIScrollView_setMj_insetR:{instance}.12aee9fa466171ca35f2b72511ac6b2c.attr │ │ ├── UIScrollView_setMj_insetT:{instance}.48d5cd4609dcdd5cff9a9c427036d431.attr │ │ ├── UIScrollView_setMj_offsetX:{instance}.e4bac092fb29b1d9c57a97f035e115ee.attr │ │ ├── UIScrollView_setMj_offsetY:{instance}.b20c4dbf093bd5a03175f1fa88401744.attr │ │ ├── UIScrollView_setMj_reloadDataBlock:{instance}.76ba198ea223a97ea4f70bb1841542da.attr │ │ ├── UIScrollView_setScrollEnabled:{instance}.45832e63699ae4c09e268546c06b603c.attr │ │ ├── UIScrollView_setScrollsToTop:{instance}.1781c1c7913dbf277b060b2ad000f7d1.attr │ │ ├── UIScrollView_setShowsHorizontalScrollIndicator:{instance}.4d9fa3a033af752cfc9b2957780a9a18.attr │ │ ├── UIScrollView_setShowsVerticalScrollIndicator:{instance}.4cf4244522f213cf763e4da1b739c164.attr │ │ ├── UITableView_exchangeInstanceMethod1:method2:{class}.6c90bca382792c410ed205c1df305598.attr │ │ ├── UITableView_load{class}.84c274c5438215fdde4219bec1285f66.attr │ │ ├── UITableView_mj_reloadData{instance}.8779ce6889d187a3a60ecee233b45a4d.attr │ │ ├── UITableView_numberOfRowsInSection:{instance}.97c4ed6b84f71b6f8639bfe7e36b45dd.attr │ │ ├── UITableView_numberOfSections{instance}.d3b6f58354cc85621d3844e12b016ff7.attr │ │ ├── UITouch_locationInView:{instance}.6a054f5819a4dc8bfe1a464ab790d241.attr │ │ ├── UIView_addGestureRecognizer:{instance}.5d657f4e80ce5c4fd6a6d26e7b07abbc.attr │ │ ├── UIView_addSubview:{instance}.c934a3bd40a524ae869862a432f5e368.attr │ │ ├── UIView_animateWithDuration:animations:completion:{class}.2fbae83d2d4b3075330b6acd0123fbf8.attr │ │ ├── UIView_animateWithDuration:animations:{class}.f3ad807f22a7e5fef7f44ca9221e0e54.attr │ │ ├── UIView_beginAnimations:context:{class}.13586b086f490c5804a3dd8a161b01eb.attr │ │ ├── UIView_bounds{instance}.dfdcdac9b90b82d6d190dbcd41287c8c.attr │ │ ├── UIView_commitAnimations{class}.a170df192a6bc57c8a780671db28cb97.attr │ │ ├── UIView_constraints{instance}.b352270b6842071fcf82725e671f866e.attr │ │ ├── UIView_drawRect:{instance}.220292325593a2ab2703e71165083697.attr │ │ ├── UIView_frame{instance}.e774555e447e80fc64977496e0756bf6.attr │ │ ├── UIView_initWithCoder:{instance}.1f4ad3ff1b1143efe631e41eec3f5f69.attr │ │ ├── UIView_initWithFrame:{instance}.999cfd7adff53531c19a1800d4b26074.attr │ │ ├── UIView_insertSubview:atIndex:{instance}.eeda326685d1a257553b02a0fad012d1.attr │ │ ├── UIView_isHidden{instance}.2f69e83805c7bd9ee39652f78fe8ec50.attr │ │ ├── UIView_isUserInteractionEnabled{instance}.8e4a5c03a7a25defaaf97fd11479aa6d.attr │ │ ├── UIView_layer{instance}.718eacf24871543710ae657b71dd6bd7.attr │ │ ├── UIView_layoutSubviews{instance}.eea9f1b8f1b5a78329564f6b6acc13b4.attr │ │ ├── UIView_mj_h{instance}.ee1ab511f6d44208e5e19010a90366d1.attr │ │ ├── UIView_mj_origin{instance}.2920f5c507be706665b2cd16dee7bd48.attr │ │ ├── UIView_mj_size{instance}.1a606f4737e097976c18bab3c2937c8a.attr │ │ ├── UIView_mj_w{instance}.40d5044cb68b9af45a11d48702981b38.attr │ │ ├── UIView_mj_x{instance}.68420f3d9cbd6af5459acfe1f5ff8969.attr │ │ ├── UIView_mj_y{instance}.5ee543392493c0ac7824532a483f2ecb.attr │ │ ├── UIView_removeFromSuperview{instance}.ffbbc6f0cb8ecaa369141c8b7f532f5d.attr │ │ ├── UIView_setAlpha:{instance}.37c5d037012d55dd3560f77cc1fa7a6f.attr │ │ ├── UIView_setAnimationDelegate:{class}.50bc488c433dafa113af1fe4ea2d5611.attr │ │ ├── UIView_setAnimationDidStopSelector:{class}.6a7928deb7b9b1b3dc2603d6784c9b4d.attr │ │ ├── UIView_setAnimationDuration:{class}.965cf2440653ae52eecea15019ba704f.attr │ │ ├── UIView_setAutoresizingMask:{instance}.a5cdfea613aa444e8dc67662733c0332.attr │ │ ├── UIView_setBackgroundColor:{instance}.451fb747cf7fc6379f90628489956b27.attr │ │ ├── UIView_setBounds:{instance}.0aff0d58436c27abfee4c4849f09e33e.attr │ │ ├── UIView_setCenter:{instance}.9f0bbd04d0b4ce5e2e2c991d737e2289.attr │ │ ├── UIView_setContentMode:{instance}.fa1cca3e860c2ed84d8700492042c119.attr │ │ ├── UIView_setFrame:{instance}.e1f4e66623b3536d72fe2f949afeb9ea.attr │ │ ├── UIView_setHidden:{instance}.eb45b6df3bae1f0ccaffc74c6b88668a.attr │ │ ├── UIView_setMj_h:{instance}.e3c6b5717320a086e65063710338abec.attr │ │ ├── UIView_setMj_origin:{instance}.172127b30d28a15fd36a401db0f22d36.attr │ │ ├── UIView_setMj_size:{instance}.489fcf45b45f241ec7b42263ac5af8d5.attr │ │ ├── UIView_setMj_w:{instance}.f49ebde9182999565f9e96ae7c6f508c.attr │ │ ├── UIView_setMj_x:{instance}.055a79745f644de01d6f4b9ebac4198d.attr │ │ ├── UIView_setMj_y:{instance}.48f4dc71b9e738f0a240f9bf0482deb2.attr │ │ ├── UIView_setNeedsDisplay{instance}.8e6b550f944d6019a6ed88f57214706f.attr │ │ ├── UIView_setNeedsLayout{instance}.b8c290f62d91388862b1652f0a26d702.attr │ │ ├── UIView_setOpaque:{instance}.f9eb73db4abc14bc58e9a4403fda266c.attr │ │ ├── UIView_setTransform:{instance}.92302a29ddb7c4e064002ae5b0da286b.attr │ │ ├── UIView_subviews{instance}.b8fef094369377a86291add963fee252.attr │ │ ├── UIView_superview{instance}.b54fb789be2c477c4f47f51e13f9a9de.attr │ │ ├── UIView_willMoveToSuperview:{instance}.83e241c7ea1cdc09f9c8fb6e0d35e505.attr │ │ ├── UIView_window{instance}.a9414123fc356526946920d8cd289dfc.attr │ │ ├── __infer_assume.763fa5689f30d86011d25fe6db5d82b0.attr │ │ ├── __inline_isnand.9daa6d15806960182ff01bb9776dc168.attr │ │ ├── __inline_isnanf.d7f7e2f6701f527453d27757c1cd0bb7.attr │ │ ├── __inline_isnanl.0e383e1e13fc7d27d7793ad3d239ef63.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______1.ac00e0b31d310500f8d60cbc5fe837d4.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______2.7bdf1a5d4cc5e5ba3c504eddfeac85db.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______3.471cb3b49d3a9cab6761cbe3ec1d252c.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4.429f1ffb7ec31f9a9c435111bc406f9c.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5.a41e476bf4b88c8e9f84999dce16c732.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6.dee26246d5e256df34bdf8b19b84cde7.attr │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7.269aa7e8b4620722a518c763475e9f4f.attr │ │ ├── __objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______.409368d69a6b2c45cfe2d573b5fa37c4.attr │ │ ├── __objc_anonymous_block_MJRefreshAutoFooter_setState:______1.aedcdd766515748b002173dc90ceff19.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_endRefreshing______5.f746c28cdd1c3f742fca6eecb5947b8b.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_noticeNoMoreData______6.76d263dba46eb0370ed7480e9cb3b56f.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______1.cfa28ad1b71153eff2ab2df148a9350c.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______2.8de7ef77687044e540ac043423b63632.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______3.b2c868550af9354ff62f3e4fc3848162.attr │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______4.ab8afe779bff8ed6270e2d15f642c4fe.attr │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1.7522c36b71d1ab187151be463eff1098.attr │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2.c0b565ccdc6399fe31cea3f918a63d77.attr │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3.96e6d447a9ecb2dbbf0a435a452011fe.attr │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4.fc556a200c10aeee80632a7de7f14568.attr │ │ ├── __objc_anonymous_block_MJRefreshComponent_beginRefreshing______1.21a03cc40ef29fea9c999c520e574567.attr │ │ ├── __objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2.ac25df20ab117714920dc4367d5da310.attr │ │ ├── __objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1.06e600200d9f03e2ae58f19c069e87ed.attr │ │ ├── __objc_anonymous_block_MJRefreshHeader_endRefreshing______5.bf7c3d564e1f67dffe3fb8f441a17a01.attr │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______1.d3a54c1db631c871b31b389567116d06.attr │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______2.76071b0d0f5e67c93ff3d61cf3a3789e.attr │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______3.8532e74d34f685982ae68b06d10fd8df.attr │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______4.7d0f7a7a3eb581c034485e549b090838.attr │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______1.13050930c71724b7417ba383bb55c321.attr │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______2.1b4d0233230d9fceaa325a329806fc0d.attr │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______3.696a392bca56dbc6cc8c2c8a2eb661b9.attr │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______4.2249f9bd76235aa33803cf6005991b20.attr │ │ ├── __objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue.c2d18021879fb88e6826d66a2b095c56.attr │ │ ├── __tg_acos{840691106643d0420542f4b9eb7071d7}.43d6bffb10b8d18622ded581519a817e.attr │ │ ├── __tg_round{840691106643d0420542f4b9eb7071d7}.b167308f29775a1872c814cfef430a12.attr │ │ ├── ceilf.c35ffbe720ff6f15515cddd67ec17360.attr │ │ ├── class_getClassMethod.b61336e980ae12ec9fd181d56184244e.attr │ │ ├── class_getInstanceMethod.476ebc3b586481c6c4f86d1000ced2ba.attr │ │ ├── dispatch_get_global_queue.37c0928a2fd099b4674969aa504a47d4.attr │ │ ├── free.aa2d6e4f578eb0cfaba23beef76c2194.attr │ │ ├── malloc.224eda3dc1d26b208edcc3a08d3175f2.attr │ │ ├── method_exchangeImplementations.004d39e0a6392a3e41564f956dd33e53.attr │ │ ├── objc_getAssociatedObject.c8d44d4e93a9a269c0b5fa0d184c87c0.attr │ │ ├── objc_msgSend.080a5d880a7fe2378f966440a8b14758.attr │ │ ├── objc_object_CGPointValue{instance}.113afdb97cec07996c74499ac383bd26.attr │ │ ├── objc_object_doubleValue{instance}.6e0a5de0fae3d3a57031b3f9963bf917.attr │ │ ├── objc_object_floatValue{instance}.eaa8a7f0730176efb26b974c69e0db91.attr │ │ ├── objc_object_initWithView:{instance}.bbf54c8b0d0b9a0461af1a8bd2599bc5.attr │ │ ├── objc_object_init{instance}.4ea9869683b94e8d1953de2594f2272b.attr │ │ ├── objc_object_isKindOfClass:{instance}.065002119ae85d6e5b8a1f63a85b4e25.attr │ │ ├── objc_object_performSelector:withObject:{instance}.09bb66ed9fd8f528870acab4e906b23a.attr │ │ ├── objc_object_respondsToSelector:{instance}.b81867383c76614f5cc7161e622bf997.attr │ │ ├── objc_object_setValue:forKey:{instance}.3ac002600c5853b5aa7637064daf5e1d.attr │ │ ├── objc_setAssociatedObject.7ea322e13ef2b48c11f38662c94e0875.attr │ │ ├── roundf.bd19547b602dd13481be74c905a74397.attr │ │ └── sel_getName.cf2cb9a34374385686a41d267cf0b39f.attr │ ├── bugs.txt │ ├── captured/ │ │ ├── Alamofire-dummy.m.6d09ccfa28152a26014c27759907e588/ │ │ │ ├── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.cfg │ │ │ ├── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.cg │ │ │ └── Alamofire-dummy.m.3cf25aeb2bad93f01908ce84bfe55bc6.tenv │ │ ├── Alamofire_vers.c.8254cedb6fb41479278cde7811b8d08f/ │ │ │ ├── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.cfg │ │ │ ├── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.cg │ │ │ └── Alamofire_vers.c.e7652d1cffef37678648eadf480ced31.tenv │ │ ├── HMSegmentedControl.m.3ada2ea9130f9a3bb1eba0413ee61fd2/ │ │ │ ├── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.cfg │ │ │ ├── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.cg │ │ │ └── HMSegmentedControl.m.f55267153a5a085e7033d6ace6f57f0b.tenv │ │ ├── IQKeyboardManagerSwift-dummy.m.7b6e737acd46f056f78947ffd5d24033/ │ │ │ ├── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.cfg │ │ │ ├── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.cg │ │ │ └── IQKeyboardManagerSwift-dummy.m.93b3a5567a32c2632e99aec38b481d2f.tenv │ │ ├── IQKeyboardManagerSwift_vers.c.f21e5b0f68d1cf813cae480426968773/ │ │ │ ├── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.cfg │ │ │ ├── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.cg │ │ │ └── IQKeyboardManagerSwift_vers.c.864f5644b19f877e616f223029ac114c.tenv │ │ ├── Kingfisher-dummy.m.8a951ae840d733902b687e9445028f55/ │ │ │ ├── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.cfg │ │ │ ├── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.cg │ │ │ └── Kingfisher-dummy.m.3301c2c6c20c895cd5b2f17680031084.tenv │ │ ├── Kingfisher_vers.c.00419a18a8a213a3e0b6ae9fa5cec143/ │ │ │ ├── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.cfg │ │ │ ├── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.cg │ │ │ └── Kingfisher_vers.c.ab85ca49f5236b33b689b3d2f7b30832.tenv │ │ ├── MBProgressHUD-dummy.m.2cbcc6b03a541520b945b322f2af3999/ │ │ │ ├── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.cfg │ │ │ ├── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.cg │ │ │ └── MBProgressHUD-dummy.m.94ed195adb8e987a55cd7f536b8d4391.tenv │ │ ├── MBProgressHUD.m.045dbb041f57e2890a8587701e40a10f/ │ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cfg │ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cg │ │ │ └── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.tenv │ │ ├── MBProgressHUD.m.2d788876e46e11285e0fd8ab23884da0/ │ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cfg │ │ │ ├── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.cg │ │ │ └── MBProgressHUD.m.77bb4d01f867ea1f44d816a66131d999.tenv │ │ ├── MBProgressHUD_vers.c.55e8963b1036818ef14b9ff87abb4381/ │ │ │ ├── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.cfg │ │ │ ├── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.cg │ │ │ └── MBProgressHUD_vers.c.43d99a7de32a8f2d06e98107c04bbc41.tenv │ │ ├── MJRefresh-dummy.m.89641addd9b18d30b1f3ccfcacc1da14/ │ │ │ ├── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.cfg │ │ │ ├── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.cg │ │ │ └── MJRefresh-dummy.m.c19c9ff64c412d5b31de15ca7f9de397.tenv │ │ ├── MJRefreshAutoFooter.m.ccfbabb8dfc249bd8a1556531300613e/ │ │ │ ├── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.cfg │ │ │ ├── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.cg │ │ │ └── MJRefreshAutoFooter.m.8f3b996ff08a9d1d3cf51a7fb9683d0c.tenv │ │ ├── MJRefreshAutoGifFooter.m.a31382caf4ac8759682b9a5a16a0c221/ │ │ │ ├── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.cfg │ │ │ ├── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.cg │ │ │ └── MJRefreshAutoGifFooter.m.fbc180b477df91631f1ae1b711b7ad38.tenv │ │ ├── MJRefreshAutoNormalFooter.m.160698844e47dc16f7937652bf531356/ │ │ │ ├── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.cfg │ │ │ ├── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.cg │ │ │ └── MJRefreshAutoNormalFooter.m.acc5592aea13c97fed9d64632207e380.tenv │ │ ├── MJRefreshAutoStateFooter.m.4b8722870b787ea3822663dce7a9a42b/ │ │ │ ├── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.cfg │ │ │ ├── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.cg │ │ │ └── MJRefreshAutoStateFooter.m.f3a5395ab3dd93065f871317cb869958.tenv │ │ ├── MJRefreshBackFooter.m.c7c9312f3c1f73ce64abb9b05afc0c3e/ │ │ │ ├── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.cfg │ │ │ ├── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.cg │ │ │ └── MJRefreshBackFooter.m.8b835d53e85b841b7fef8c7e24d53354.tenv │ │ ├── MJRefreshBackGifFooter.m.9fbdeffb50ad5cddb2eb31f449cef553/ │ │ │ ├── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.cfg │ │ │ ├── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.cg │ │ │ └── MJRefreshBackGifFooter.m.19435fcb848b09c997ccea089b1f6910.tenv │ │ ├── MJRefreshBackNormalFooter.m.9fee50dbf43908ec8fb61f6997bcab26/ │ │ │ ├── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.cfg │ │ │ ├── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.cg │ │ │ └── MJRefreshBackNormalFooter.m.17e99acb215a92c052caf7cd719aced9.tenv │ │ ├── MJRefreshBackStateFooter.m.d38f2bdb12763b5fdd12e2cbeee1c695/ │ │ │ ├── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.cfg │ │ │ ├── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.cg │ │ │ └── MJRefreshBackStateFooter.m.7da68a0a0457fb07095b594d1e4fd09a.tenv │ │ ├── MJRefreshComponent.m.34ccc65193a850aa6cacb1e560d2e18f/ │ │ │ ├── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.cfg │ │ │ ├── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.cg │ │ │ └── MJRefreshComponent.m.f8bc97a2b665f7b6757c4a2e86309d9b.tenv │ │ ├── MJRefreshConst.m.10ebaf8e0e1dbc8c756595f4b7e51b53/ │ │ │ ├── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.cfg │ │ │ ├── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.cg │ │ │ └── MJRefreshConst.m.1e4d22c0d8057d612f3542d3d0d3ab42.tenv │ │ ├── MJRefreshFooter.m.1171c762a89233728365cd4c56dc3f42/ │ │ │ ├── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.cfg │ │ │ ├── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.cg │ │ │ └── MJRefreshFooter.m.f53adcd8ea99e29c1c6c2bcb8fde7942.tenv │ │ ├── MJRefreshGifHeader.m.ec82e1fce0432afaace206d5863c0918/ │ │ │ ├── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.cfg │ │ │ ├── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.cg │ │ │ └── MJRefreshGifHeader.m.9a5df955b11480208e981ea8431ab83e.tenv │ │ ├── MJRefreshHeader.m.23f6ad1fa93bce55e58df454e3c81f28/ │ │ │ ├── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.cfg │ │ │ ├── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.cg │ │ │ └── MJRefreshHeader.m.ea1b118a2b84a94f3793a325ee537804.tenv │ │ ├── MJRefreshNormalHeader.m.1bda2488e255708da2996916537e8619/ │ │ │ ├── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.cfg │ │ │ ├── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.cg │ │ │ └── MJRefreshNormalHeader.m.8cf124baec1eb944fc9dcacb6e7493ce.tenv │ │ ├── MJRefreshStateHeader.m.a270adbea6697f5f08d5a7c099a20e77/ │ │ │ ├── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.cfg │ │ │ ├── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.cg │ │ │ └── MJRefreshStateHeader.m.08d505ba1d0a2929d6fd49b279cc42c7.tenv │ │ ├── MJRefresh_vers.c.fdbf3bfbf5344618726d9bdc20a96ac8/ │ │ │ ├── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.cfg │ │ │ ├── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.cg │ │ │ └── MJRefresh_vers.c.2897d6619eefb8ad938595d78e314c4a.tenv │ │ ├── Moya-dummy.m.7ca1843127a0c59014b13cb46b4be5c5/ │ │ │ ├── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.cfg │ │ │ ├── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.cg │ │ │ └── Moya-dummy.m.b89accf00db26359b04edc10060f3c51.tenv │ │ ├── Moya_vers.c.ccdf2bc7f3b870bcbaf3fb8b74e5c3b1/ │ │ │ ├── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.cfg │ │ │ ├── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.cg │ │ │ └── Moya_vers.c.3451270a87ddaa93d39cc40065bd4b26.tenv │ │ ├── ObjectMapper-dummy.m.9e3146cd2b23217c763a2d504a75457e/ │ │ │ ├── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.cfg │ │ │ ├── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.cg │ │ │ └── ObjectMapper-dummy.m.81b9209ff09e85154578c8f219710667.tenv │ │ ├── ObjectMapper_vers.c.2c870b1208e8a54bd7f7a7bd1a592dc5/ │ │ │ ├── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.cfg │ │ │ ├── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.cg │ │ │ └── ObjectMapper_vers.c.6832f0fc769368c246c0b5140c3441b3.tenv │ │ ├── Pods-dummy.m.78ce02d1bec8d9a8cdf8e193eac92c0c/ │ │ │ ├── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.cfg │ │ │ ├── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.cg │ │ │ └── Pods-dummy.m.41f6871746d6ec21d524e86fc88427b4.tenv │ │ ├── Pods_vers.c.e34b81a174547bf13f9c59c29a71f79d/ │ │ │ ├── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.cfg │ │ │ ├── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.cg │ │ │ └── Pods_vers.c.2eae1ecd33129543bf1a7a99486f0c5c.tenv │ │ ├── ReachabilitySwift-dummy.m.81bcb52c99c18a6d774b3dd976fb0214/ │ │ │ ├── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.cfg │ │ │ ├── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.cg │ │ │ └── ReachabilitySwift-dummy.m.687de7e7d6e63ce3b7f7c114e5a7aabc.tenv │ │ ├── ReachabilitySwift_vers.c.106744f7723126899873b7d2d4e22295/ │ │ │ ├── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.cfg │ │ │ ├── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.cg │ │ │ └── ReachabilitySwift_vers.c.90417ce64ef95d4d1d26d128c4f4ddca.tenv │ │ ├── Result-dummy.m.487d4a46f6fc74236bcbc3ae7d7c27ab/ │ │ │ ├── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.cfg │ │ │ ├── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.cg │ │ │ └── Result-dummy.m.1f7435f84f78465b941740a6605f13ab.tenv │ │ ├── Result_vers.c.ef95a536428b9b58e98412eb536774b5/ │ │ │ ├── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.cfg │ │ │ ├── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.cg │ │ │ └── Result_vers.c.1c335bbba3c619b5e45eb0333c7e5414.tenv │ │ ├── SnapKit-dummy.m.552f2542a60bc7af3ec07236cbb386be/ │ │ │ ├── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.cfg │ │ │ ├── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.cg │ │ │ └── SnapKit-dummy.m.7acfcb3843b5b230a9e6984ffa5e0226.tenv │ │ ├── SnapKit_vers.c.7f12e521ccb5413d5db82f8ce23e056f/ │ │ │ ├── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.cfg │ │ │ ├── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.cg │ │ │ └── SnapKit_vers.c.3a6b330540276a447a3fe15b5fced76a.tenv │ │ ├── SwiftDate-dummy.m.b9c681999e8e59b4dd482bdf37fe6f24/ │ │ │ ├── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.cfg │ │ │ ├── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.cg │ │ │ └── SwiftDate-dummy.m.feb025c96307bcbfc89c3f778e1b6b1e.tenv │ │ ├── SwiftDate_vers.c.4326ee98dee4b56883987638959c8def/ │ │ │ ├── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.cfg │ │ │ ├── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.cg │ │ │ └── SwiftDate_vers.c.a4734f8c7b0bc0f3b8e66ccf1d4c8f5e.tenv │ │ ├── SwiftyJSON-dummy.m.07fe6c3e47a33789842e405038d2424a/ │ │ │ ├── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.cfg │ │ │ ├── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.cg │ │ │ └── SwiftyJSON-dummy.m.8407b3791bf30dfa3d3cb3473fb1bdec.tenv │ │ ├── SwiftyJSON_vers.c.de83cfb439c8f4f5f1edfe8aabce609d/ │ │ │ ├── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.cfg │ │ │ ├── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.cg │ │ │ └── SwiftyJSON_vers.c.ac7dc6e04065e841a9af2170dd865fc5.tenv │ │ ├── UIScrollView+MJExtension.m.e58616bc3e3601567328a68aaf6990a3/ │ │ │ ├── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.cfg │ │ │ ├── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.cg │ │ │ └── UIScrollView+MJExtension.m.bb0212caffedd1154fda05f2aa1eaf27.tenv │ │ ├── UIScrollView+MJRefresh.m.c656b88045d9e660612378e050df8caa/ │ │ │ ├── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.cfg │ │ │ ├── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.cg │ │ │ └── UIScrollView+MJRefresh.m.cbf22b46b8e8d7ce0c053bbd404b9977.tenv │ │ └── UIView+MJExtension.m.fcc8a28eead7a716734205472672c935/ │ │ ├── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.cfg │ │ ├── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.cg │ │ └── UIView+MJExtension.m.e6dfb20a0cf28329d729d37c7d270c2c.tenv │ ├── multicore/ │ │ ├── Makefile │ │ ├── cl1 │ │ ├── cl10 │ │ ├── cl11 │ │ ├── cl12 │ │ ├── cl13 │ │ ├── cl14 │ │ ├── cl15 │ │ ├── cl16 │ │ ├── cl17 │ │ ├── cl18 │ │ ├── cl19 │ │ ├── cl2 │ │ ├── cl3 │ │ ├── cl4 │ │ ├── cl5 │ │ ├── cl6 │ │ ├── cl7 │ │ ├── cl8 │ │ ├── cl9 │ │ ├── xcl1.cluster │ │ ├── xcl10.cluster │ │ ├── xcl11.cluster │ │ ├── xcl12.cluster │ │ ├── xcl13.cluster │ │ ├── xcl14.cluster │ │ ├── xcl15.cluster │ │ ├── xcl16.cluster │ │ ├── xcl17.cluster │ │ ├── xcl18.cluster │ │ ├── xcl19.cluster │ │ ├── xcl2.cluster │ │ ├── xcl3.cluster │ │ ├── xcl4.cluster │ │ ├── xcl5.cluster │ │ ├── xcl6.cluster │ │ ├── xcl7.cluster │ │ ├── xcl8.cluster │ │ └── xcl9.cluster │ ├── proc_stats.json │ ├── procs.csv │ ├── report.csv │ ├── report.json │ ├── sources/ │ │ ├── HMSegmentedControl.m.3ada2ea9130f9a3bb1eba0413ee61fd2 │ │ ├── MBProgressHUD.m.045dbb041f57e2890a8587701e40a10f │ │ ├── MBProgressHUD.m.2d788876e46e11285e0fd8ab23884da0 │ │ ├── MJRefreshAutoFooter.m.ccfbabb8dfc249bd8a1556531300613e │ │ ├── MJRefreshAutoGifFooter.m.a31382caf4ac8759682b9a5a16a0c221 │ │ ├── MJRefreshAutoNormalFooter.m.160698844e47dc16f7937652bf531356 │ │ ├── MJRefreshAutoStateFooter.m.4b8722870b787ea3822663dce7a9a42b │ │ ├── MJRefreshBackFooter.m.c7c9312f3c1f73ce64abb9b05afc0c3e │ │ ├── MJRefreshBackGifFooter.m.9fbdeffb50ad5cddb2eb31f449cef553 │ │ ├── MJRefreshBackNormalFooter.m.9fee50dbf43908ec8fb61f6997bcab26 │ │ ├── MJRefreshBackStateFooter.m.d38f2bdb12763b5fdd12e2cbeee1c695 │ │ ├── MJRefreshComponent.m.34ccc65193a850aa6cacb1e560d2e18f │ │ ├── MJRefreshFooter.m.1171c762a89233728365cd4c56dc3f42 │ │ ├── MJRefreshGifHeader.m.ec82e1fce0432afaace206d5863c0918 │ │ ├── MJRefreshHeader.m.23f6ad1fa93bce55e58df454e3c81f28 │ │ ├── MJRefreshNormalHeader.m.1bda2488e255708da2996916537e8619 │ │ ├── MJRefreshStateHeader.m.a270adbea6697f5f08d5a7c099a20e77 │ │ ├── UIScrollView+MJExtension.m.e58616bc3e3601567328a68aaf6990a3 │ │ ├── UIScrollView+MJRefresh.m.c656b88045d9e660612378e050df8caa │ │ └── UIView+MJExtension.m.fcc8a28eead7a716734205472672c935 │ ├── specs/ │ │ ├── HMScrollView_touchesBegan:withEvent:{instance}.d59f2b4a0fda4ec48b036513c8dd8cc9.specs │ │ ├── HMScrollView_touchesEnded:withEvent:{instance}.8f3c38acc9d5dc615c13261818676983.specs │ │ ├── HMScrollView_touchesMoved:withEvent:{instance}.c1670bac25a0a202b52dda692c907230.specs │ │ ├── HMSegmentedControl_addBackgroundAndBorderLayerWithRect:{instance}.7dd0377b1da0e5b410137e62fdec2030.specs │ │ ├── HMSegmentedControl_attributedTitleAtIndex:{instance}.a5b762b44c0d812624d2256563840cc5.specs │ │ ├── HMSegmentedControl_awakeFromNib{instance}.f3fa814debe72a72b9e0eb7ccf2e15a5.specs │ │ ├── HMSegmentedControl_commonInit{instance}.38533cdade2a6665dabfbf9b34dfee27.specs │ │ ├── HMSegmentedControl_drawRect:{instance}.0f8cfeaafe528d71c9e70549d32ab6c8.specs │ │ ├── HMSegmentedControl_frameForFillerSelectionIndicator{instance}.ee003ec468962badb351fdc66dbf4daf.specs │ │ ├── HMSegmentedControl_frameForSelectionIndicator{instance}.fab573ad9ae86c7cadaf030789e843c9.specs │ │ ├── HMSegmentedControl_initWithCoder:{instance}.a09c14109303b8ad5c335eb9da3d110b.specs │ │ ├── HMSegmentedControl_initWithFrame:{instance}.a49a182bda2ad6bcf70effd8929a23fc.specs │ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:{instance}.b753ee5d390184caf95711bd19d683b5.specs │ │ ├── HMSegmentedControl_initWithSectionImages:sectionSelectedImages:{instance}.e9b578c4330b480104536188b8a8c976.specs │ │ ├── HMSegmentedControl_initWithSectionTitles:{instance}.437880827dc06daf2642eb51cedee689.specs │ │ ├── HMSegmentedControl_layoutSubviews{instance}.68711c72c0e4854dcc75ef707417c22e.specs │ │ ├── HMSegmentedControl_measureTitleAtIndex:{instance}.b9e49ac420b85b440d716583a1199bd7.specs │ │ ├── HMSegmentedControl_notifyForSegmentChangeToIndex:{instance}.9961984e3a59a06f9dce68085bd94b07.specs │ │ ├── HMSegmentedControl_resultingSelectedTitleTextAttributes{instance}.cc39ce9e58be4ecf606a42f75b7a1e18.specs │ │ ├── HMSegmentedControl_resultingTitleTextAttributes{instance}.c6edf072205c8920b9c3804bcb465668.specs │ │ ├── HMSegmentedControl_scrollToSelectedSegmentIndex:{instance}.3b10d351a059eceb4ce7dcc296c10e6b.specs │ │ ├── HMSegmentedControl_sectionCount{instance}.8f2d3f243fe8914f47b850886fe77ce5.specs │ │ ├── HMSegmentedControl_setArrowFrame{instance}.5826476954afd05d70ceb71ec673b941.specs │ │ ├── HMSegmentedControl_setBorderType:{instance}.913cdb23a533132e5838aec6b4e59339.specs │ │ ├── HMSegmentedControl_setFrame:{instance}.1c7263eacfefb1784864fef2d128686f.specs │ │ ├── HMSegmentedControl_setSectionImages:{instance}.dd1712712826815f898cd900d8051af2.specs │ │ ├── HMSegmentedControl_setSectionTitles:{instance}.659c7c1b9fb7032b7e893febe52349bc.specs │ │ ├── HMSegmentedControl_setSegmentWidthStyle:{instance}.0e2d4c1c6e034b4ded13d0bda80fc966.specs │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:notify:{instance}.e28550bafd2dd200d908ec93bf0f5f6f.specs │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:animated:{instance}.2d10a374506ae4092dce3c89aa0d3ed2.specs │ │ ├── HMSegmentedControl_setSelectedSegmentIndex:{instance}.7c671210f6f2a504f070e13fa74c6c0f.specs │ │ ├── HMSegmentedControl_setSelectionIndicatorBoxOpacity:{instance}.45b69f43098a4683dfc106f58afed905.specs │ │ ├── HMSegmentedControl_setSelectionIndicatorLocation:{instance}.a53daba01d6a3f4bf906c7cecf124d14.specs │ │ ├── HMSegmentedControl_totalSegmentedControlWidth{instance}.0d2a745a35745340bb11b6dca1981618.specs │ │ ├── HMSegmentedControl_touchesEnded:withEvent:{instance}.4e627b0727b096ec8303653816d71374.specs │ │ ├── HMSegmentedControl_updateSegmentsRects{instance}.84ec9da3b15ae6609959e7b9d4e514d6.specs │ │ ├── HMSegmentedControl_willMoveToSuperview:{instance}.664e57902a9674b629014432c158bbe2.specs │ │ ├── MBBarProgressView_dealloc{instance}.adf1ad15c84766ba9dcf79183c69c3d4.specs │ │ ├── MBBarProgressView_drawRect:{instance}.320d681186c8fba8f6b277de3f5578a2.specs │ │ ├── MBBarProgressView_initWithFrame:{instance}.ed6320a3deccb73365df0525f4c1b164.specs │ │ ├── MBBarProgressView_init{instance}.d718a21a2e82160043ea8993b48ff857.specs │ │ ├── MBBarProgressView_observableKeypaths{instance}.39b90d036d77a64fc5e4fecf6065c87c.specs │ │ ├── MBBarProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.7954f9a6af46f9f68c1a1f6b5a2ccdd2.specs │ │ ├── MBBarProgressView_registerForKVO{instance}.071c8b1636d94f57ae8971bc36daf118.specs │ │ ├── MBBarProgressView_unregisterFromKVO{instance}.b5a5120611688f493d5727fdfa6d5960.specs │ │ ├── MBProgressHUD_HUDForView:{class}.a2951ab8562d7ef65f3c11867a36db30.specs │ │ ├── MBProgressHUD_allHUDsForView:{class}.c62400802f12bd5a57844c12fcb0585f.specs │ │ ├── MBProgressHUD_animationFinished:finished:context:{instance}.9c5e683b9e4ea724431986aec092468a.specs │ │ ├── MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3.specs │ │ ├── MBProgressHUD_dealloc{instance}.734bfbc384d83cb0e26dba7831bb5b5a.specs │ │ ├── MBProgressHUD_didMoveToSuperview{instance}.bdd65a2c02acb5f730c9ffafb0a5d09e.specs │ │ ├── MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a.specs │ │ ├── MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604.specs │ │ ├── MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9.specs │ │ ├── MBProgressHUD_handleMinShowTimer:{instance}.7aafa41664c3ff7af3a291cab98261c3.specs │ │ ├── MBProgressHUD_hide:afterDelay:{instance}.c859a390b6e21c3da53cc55db145fc51.specs │ │ ├── MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507.specs │ │ ├── MBProgressHUD_hideAllHUDsForView:animated:{class}.0c50aff8a43d35a50e24dbcc63a30a32.specs │ │ ├── MBProgressHUD_hideDelayed:{instance}.c1ee27a326a7aff4bb96a0c3c0081baf.specs │ │ ├── MBProgressHUD_hideHUDForView:animated:{class}.6464d2a2482f9e32e72a33627277d762.specs │ │ ├── MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03.specs │ │ ├── MBProgressHUD_initWithFrame:{instance}.46a9a5ebd85df85c40e4ca277186520f.specs │ │ ├── MBProgressHUD_initWithView:{instance}.56c371965dcee9d54c2d7a562e2ae498.specs │ │ ├── MBProgressHUD_initWithWindow:{instance}.d9abb98f4c74d9d83026534b730b52d2.specs │ │ ├── MBProgressHUD_launchExecution{instance}.65b7de815299c22603cdc0a12874e621.specs │ │ ├── MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0.specs │ │ ├── MBProgressHUD_observableKeypaths{instance}.1d43b626b757e9a1ab7fb2a4953c8d2d.specs │ │ ├── MBProgressHUD_observeValueForKeyPath:ofObject:change:context:{instance}.6f2717bd4c58c58b1cd5304e7bfb403b.specs │ │ ├── MBProgressHUD_registerForKVO{instance}.74d4196c6bc96800ebeadb3eade5e76a.specs │ │ ├── MBProgressHUD_registerForNotifications{instance}.c083e50aaf59e994cdd425e4c9cf446b.specs │ │ ├── MBProgressHUD_setupLabels{instance}.ea2ff0fb299d03874b01a906a7e5f181.specs │ │ ├── MBProgressHUD_show:{instance}.ac44c85674baa495a162f44dec2bca1f.specs │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:{instance}.cc35373f5b0ef6d67ba0a2cd43d0a077.specs │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:{instance}.5f282b5baff14a6b325db22e8dc79cb5.specs │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:{instance}.939c8bef4c804dcce1a8f8504d065463.specs │ │ ├── MBProgressHUD_showAnimated:whileExecutingBlock:{instance}.31adcee70bd29a2315f5a590715c3deb.specs │ │ ├── MBProgressHUD_showHUDAddedTo:animated:{class}.a5ee486a46c5d3c99b9e068e9ea4baad.specs │ │ ├── MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be.specs │ │ ├── MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:{instance}.0961e1f2841c54f70f3dc0b695dfc84d.specs │ │ ├── MBProgressHUD_statusBarOrientationDidChange:{instance}.872a47e680449f7f49e472ccf7e9d082.specs │ │ ├── MBProgressHUD_unregisterFromKVO{instance}.bbf3aaf60e868fa0fb966ae29a1af573.specs │ │ ├── MBProgressHUD_unregisterFromNotifications{instance}.de0d4125b86d3858fd69944f1d235402.specs │ │ ├── MBProgressHUD_updateForCurrentOrientationAnimated:{instance}.6fe6a2b1a661f1f307de4fb6a68bd0fb.specs │ │ ├── MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3.specs │ │ ├── MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e.specs │ │ ├── MBRoundProgressView_dealloc{instance}.f76e97c78e356529b6d3487d19b1a412.specs │ │ ├── MBRoundProgressView_drawRect:{instance}.5dded631db9e81761adbc52c74e3a158.specs │ │ ├── MBRoundProgressView_initWithFrame:{instance}.202df68ce7c2e37e1d8f93454b69c4d1.specs │ │ ├── MBRoundProgressView_init{instance}.d5141eb9f853d4fabd440a664b453b2f.specs │ │ ├── MBRoundProgressView_observableKeypaths{instance}.88a67d54a2d7175b9b7f5a626393a834.specs │ │ ├── MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.3562ed8d8fbf2b3acfad83fc0f3fcfd0.specs │ │ ├── MBRoundProgressView_registerForKVO{instance}.56e6d0e76d20137d6b5a2056d5683113.specs │ │ ├── MBRoundProgressView_unregisterFromKVO{instance}.97841886debac0d49b46482098a4e1d7.specs │ │ ├── MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh{instance}.931b825764944eff97f78ef4c2c44ebd.specs │ │ ├── MJRefreshAutoFooter_prepare{instance}.81fdaf533264e53838439b6af78408c2.specs │ │ ├── MJRefreshAutoFooter_scrollViewContentOffsetDidChange:{instance}.bcfcda2745da14825e78d76c540e5ff0.specs │ │ ├── MJRefreshAutoFooter_scrollViewContentSizeDidChange:{instance}.c95f98648e58af09c6bb5f9a39329ee1.specs │ │ ├── MJRefreshAutoFooter_scrollViewPanStateDidChange:{instance}.40aa0d75b89f5a74cf08c78c183d6a19.specs │ │ ├── MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:{instance}.6d7e658eb08c918e2665dda4d02bbe0e.specs │ │ ├── MJRefreshAutoFooter_setHidden:{instance}.8187ea74fc5a524dc007acb5243e7926.specs │ │ ├── MJRefreshAutoFooter_setState:{instance}.bdb3fcb8173fa59cb33dd391730a20c2.specs │ │ ├── MJRefreshAutoFooter_willMoveToSuperview:{instance}.31c9e7668989c017342140f0185c2188.specs │ │ ├── MJRefreshAutoGifFooter_gifView{instance}.4ff145d45d6f0d9ac6a9b37155d3cc66.specs │ │ ├── MJRefreshAutoGifFooter_placeSubviews{instance}.792cabf0aff680ead0baef015354b3be.specs │ │ ├── MJRefreshAutoGifFooter_setImages:duration:forState:{instance}.c46aa256d08ae2ac7749b27d92bed622.specs │ │ ├── MJRefreshAutoGifFooter_setImages:forState:{instance}.bc030fd7ddd4c611d524187d37ba0372.specs │ │ ├── MJRefreshAutoGifFooter_setState:{instance}.ef45940c1ae3cbc92c2bc041ff067afa.specs │ │ ├── MJRefreshAutoGifFooter_stateDurations{instance}.719f9f19198062078a8a0d9ea201ca6b.specs │ │ ├── MJRefreshAutoGifFooter_stateImages{instance}.ab92380ab4ded17b30f8a08f961ee684.specs │ │ ├── MJRefreshAutoNormalFooter_loadingView{instance}.b926a86efa7bdd6b0a6a98c1e90540a4.specs │ │ ├── MJRefreshAutoNormalFooter_placeSubviews{instance}.0f8d74171158ff20387271e6a94777f4.specs │ │ ├── MJRefreshAutoNormalFooter_prepare{instance}.62a05293c68d988c434dbcd79ef0ad7b.specs │ │ ├── MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:{instance}.1740284edf4289989ed9655458e6e541.specs │ │ ├── MJRefreshAutoNormalFooter_setState:{instance}.92eb8a4693eb9e978510f5f8e8d079b6.specs │ │ ├── MJRefreshAutoStateFooter_placeSubviews{instance}.e05bd88dad611fa3f5641cc10cf22caf.specs │ │ ├── MJRefreshAutoStateFooter_prepare{instance}.39111306cd810d7e8289797116b20acc.specs │ │ ├── MJRefreshAutoStateFooter_setState:{instance}.41f13d685c1d0107cac76f5e6cdc6f22.specs │ │ ├── MJRefreshAutoStateFooter_setTitle:forState:{instance}.a6f426bbeb7cb198331cbcece4cf4ec0.specs │ │ ├── MJRefreshAutoStateFooter_stateLabelClick{instance}.8d69ce4f9c38bcef0e235e719a0ddbdf.specs │ │ ├── MJRefreshAutoStateFooter_stateLabel{instance}.0d1656cd91316c5fef17b9f5de691d6b.specs │ │ ├── MJRefreshAutoStateFooter_stateTitles{instance}.45df57b523fb4f840f1c9d536a35d61c.specs │ │ ├── MJRefreshBackFooter_endRefreshing{instance}.958680d523a94ab59c1c9601c2541ab2.specs │ │ ├── MJRefreshBackFooter_happenOffsetY{instance}.0dae9169061683402ab2798299f74adc.specs │ │ ├── MJRefreshBackFooter_heightForContentBreakView{instance}.6c28d740d05c68bd5806d8010e497a29.specs │ │ ├── MJRefreshBackFooter_noticeNoMoreData{instance}.83d8a6971a587c2fe5193c2bc7f4b031.specs │ │ ├── MJRefreshBackFooter_scrollViewContentOffsetDidChange:{instance}.f883c7a60628c818fb9a69ebcf62f187.specs │ │ ├── MJRefreshBackFooter_scrollViewContentSizeDidChange:{instance}.665d5ffac44fdda6b0cfcaf9f76338c2.specs │ │ ├── MJRefreshBackFooter_setState:{instance}.2a84f32e6c9d600cfa0c5f9c490fa00b.specs │ │ ├── MJRefreshBackFooter_willMoveToSuperview:{instance}.5dcec01faa2292110b1de8e64a12c539.specs │ │ ├── MJRefreshBackGifFooter_gifView{instance}.7c4a05bcc8f049050cffa895709f2611.specs │ │ ├── MJRefreshBackGifFooter_placeSubviews{instance}.1cf5a34d6185752d129aad4c43b0cf42.specs │ │ ├── MJRefreshBackGifFooter_setImages:duration:forState:{instance}.bd185713fbda471cfa0b26d0475db1d6.specs │ │ ├── MJRefreshBackGifFooter_setImages:forState:{instance}.f959fd72b4774da01ea194a4b34ee359.specs │ │ ├── MJRefreshBackGifFooter_setPullingPercent:{instance}.157a977e4c33fa60e38cb624a19f24de.specs │ │ ├── MJRefreshBackGifFooter_setState:{instance}.fa1a5e8a04db08dde17ff7de59c16477.specs │ │ ├── MJRefreshBackGifFooter_stateDurations{instance}.ecff20c8de39266ddc0f975a0f4306e2.specs │ │ ├── MJRefreshBackGifFooter_stateImages{instance}.724b5260dc41e21938f90f2360672187.specs │ │ ├── MJRefreshBackNormalFooter_arrowView{instance}.4311ef7cafa4a9ee91bbac226b717da9.specs │ │ ├── MJRefreshBackNormalFooter_loadingView{instance}.d862d1537eaf4f13b3ea928a9d7e6bb2.specs │ │ ├── MJRefreshBackNormalFooter_placeSubviews{instance}.14a691c735954cea598f1c42945a8ade.specs │ │ ├── MJRefreshBackNormalFooter_prepare{instance}.d348875f78d00052355c482b471988da.specs │ │ ├── MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:{instance}.c11249674bf6ed2701a1780e8cf790ae.specs │ │ ├── MJRefreshBackNormalFooter_setState:{instance}.bfb37954287cc1242b9371c8e0c2c53d.specs │ │ ├── MJRefreshBackStateFooter_placeSubviews{instance}.07dd32534b9ae4810921764ceac1540a.specs │ │ ├── MJRefreshBackStateFooter_prepare{instance}.e12b6d29ae7cc426b54f69331c789d15.specs │ │ ├── MJRefreshBackStateFooter_setState:{instance}.0ffb3dd66c48270735110933d1f2f0d7.specs │ │ ├── MJRefreshBackStateFooter_setTitle:forState:{instance}.e6265b339a82b1b962fd6b7d372b38b4.specs │ │ ├── MJRefreshBackStateFooter_stateLabel{instance}.671bdcb3c3052ca29a0160eca1c6b6bd.specs │ │ ├── MJRefreshBackStateFooter_stateTitles{instance}.8c8d015f558a5b782cef16fa2a872de2.specs │ │ ├── MJRefreshBackStateFooter_titleForState:{instance}.6644d0fcdc32801821696c2a4d6f0aa8.specs │ │ ├── MJRefreshComponent_addObservers{instance}.48ac3cc9007a3c8cbb6a15277c7db9ea.specs │ │ ├── MJRefreshComponent_beginRefreshing{instance}.37e3b4491c03ca5070562df652ae4a3f.specs │ │ ├── MJRefreshComponent_drawRect:{instance}.5c9569babdce7fbc05fdb15778362755.specs │ │ ├── MJRefreshComponent_endRefreshing{instance}.2720081dcaca1ee01ca4ba03255da838.specs │ │ ├── MJRefreshComponent_executeRefreshingCallback{instance}.4f282c4379c6e540d10c12e54d80e390.specs │ │ ├── MJRefreshComponent_initWithFrame:{instance}.dcc5043bc9d4cc86799bf33ff4f78bb3.specs │ │ ├── MJRefreshComponent_isAutoChangeAlpha{instance}.d2580facd9584f5d1823586225276c0c.specs │ │ ├── MJRefreshComponent_isRefreshing{instance}.a3d1e918912f39baa99b419848f9d33b.specs │ │ ├── MJRefreshComponent_layoutSubviews{instance}.8098590c7287f2a2c27bd59d78a0452b.specs │ │ ├── MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:{instance}.5c79a9157e694b8877729d29e6accd4f.specs │ │ ├── MJRefreshComponent_placeSubviews{instance}.73d06208ee35f85eb9d849aecd472416.specs │ │ ├── MJRefreshComponent_prepare{instance}.38440e789285bd7781f72155c89e3f5a.specs │ │ ├── MJRefreshComponent_removeObservers{instance}.c9d911e52f725b43fc7b34f4a07b3923.specs │ │ ├── MJRefreshComponent_scrollViewContentOffsetDidChange:{instance}.617caa7f28422a6417560a602082f5b8.specs │ │ ├── MJRefreshComponent_scrollViewContentSizeDidChange:{instance}.e16f83d0096447be3224827fc19b9549.specs │ │ ├── MJRefreshComponent_scrollViewPanStateDidChange:{instance}.d34301c5662a55086b39dd2ec566b5ad.specs │ │ ├── MJRefreshComponent_setAutoChangeAlpha:{instance}.a04c05493fc5ecf43d98b9924f8bc78c.specs │ │ ├── MJRefreshComponent_setAutomaticallyChangeAlpha:{instance}.4591244e561c565e45c21b89ff9610d4.specs │ │ ├── MJRefreshComponent_setPullingPercent:{instance}.5755356ca5ccb563f50c75bba6db1e9d.specs │ │ ├── MJRefreshComponent_setRefreshingTarget:refreshingAction:{instance}.d064af6f306c53b4158833f0f020408a.specs │ │ ├── MJRefreshComponent_willMoveToSuperview:{instance}.7f13a46585df11309a3efe2ded73b3e8.specs │ │ ├── MJRefreshFooter_endRefreshingWithNoMoreData{instance}.7cebeaf3e25d576c2293600605c1d5dd.specs │ │ ├── MJRefreshFooter_footerWithRefreshingBlock:{class}.7b0806c0686d1afa44b5fed238c938ea.specs │ │ ├── MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:{class}.1e0bbbdfa84d1cb2fec223b55831736b.specs │ │ ├── MJRefreshFooter_noticeNoMoreData{instance}.494f0af619d71dbb29db8dfc8f282251.specs │ │ ├── MJRefreshFooter_prepare{instance}.ddd00b0bdc007d8acb701df2df7655ca.specs │ │ ├── MJRefreshFooter_resetNoMoreData{instance}.b274245415c7498741c88078022d456f.specs │ │ ├── MJRefreshFooter_willMoveToSuperview:{instance}.3e71353e4d67175789d2dd970e67fd37.specs │ │ ├── MJRefreshGifHeader_gifView{instance}.f27c0323d39ba73d7475591753b0d820.specs │ │ ├── MJRefreshGifHeader_placeSubviews{instance}.3b12f3d808f6e873748f71aeeae3b0eb.specs │ │ ├── MJRefreshGifHeader_setImages:duration:forState:{instance}.c9ff89babbdd988caa30a42380238d0f.specs │ │ ├── MJRefreshGifHeader_setImages:forState:{instance}.eedc47d9f24c22cecd1d33d19b2da587.specs │ │ ├── MJRefreshGifHeader_setPullingPercent:{instance}.09714a93b584cd6ad3c07c560b76c445.specs │ │ ├── MJRefreshGifHeader_setState:{instance}.81dabe1e4914cef626e0420acceaa1fa.specs │ │ ├── MJRefreshGifHeader_stateDurations{instance}.ee55fb0d6525e622971f502c74682d20.specs │ │ ├── MJRefreshGifHeader_stateImages{instance}.c45aa4d25429518b434a1b8d924d07b3.specs │ │ ├── MJRefreshHeader_drawRect:{instance}.c3e57b4a302b533c30bf09ca94992915.specs │ │ ├── MJRefreshHeader_endRefreshing{instance}.fb3fecfe4e2f8b20f48a86c39ec8d2c8.specs │ │ ├── MJRefreshHeader_headerWithRefreshingBlock:{class}.86bd7d9042726fde59582daf33cccd26.specs │ │ ├── MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:{class}.38704964b164af751351ca0df311361c.specs │ │ ├── MJRefreshHeader_lastUpdatedTime{instance}.2a89276f34032f5c83485ead73d73c79.specs │ │ ├── MJRefreshHeader_placeSubviews{instance}.1feae4d44bd11e658f4aca7d5d6cc6cb.specs │ │ ├── MJRefreshHeader_prepare{instance}.f8820581ac423aeb157abb616851572d.specs │ │ ├── MJRefreshHeader_scrollViewContentOffsetDidChange:{instance}.052321827b6bd024a37e6ccf4c6f5eaa.specs │ │ ├── MJRefreshHeader_setState:{instance}.613dbd07b62ad0844ea350e1c213bfec.specs │ │ ├── MJRefreshNormalHeader_arrowView{instance}.3c9cde775fac361e9e6fbd5ed8ee6d86.specs │ │ ├── MJRefreshNormalHeader_loadingView{instance}.bac4283eefad58aa66ec42809991591a.specs │ │ ├── MJRefreshNormalHeader_placeSubviews{instance}.1637f8c1509d5ff960a7ee2b01a93543.specs │ │ ├── MJRefreshNormalHeader_prepare{instance}.c5161195985077e841f425b250b31545.specs │ │ ├── MJRefreshNormalHeader_setActivityIndicatorViewStyle:{instance}.f54ee85457d5aef8dcad8becafed4dbe.specs │ │ ├── MJRefreshNormalHeader_setState:{instance}.cf4cc9b8ba9cb613d7b7656d100e6a5c.specs │ │ ├── MJRefreshStateHeader_currentCalendar{instance}.8a5d265e54d2287dcf9ab73daf03a0db.specs │ │ ├── MJRefreshStateHeader_lastUpdatedTimeLabel{instance}.39c3adf46f0e72fe1ca7bdb144690d58.specs │ │ ├── MJRefreshStateHeader_placeSubviews{instance}.3551b50672d8958430e0714f4a86608a.specs │ │ ├── MJRefreshStateHeader_prepare{instance}.f22a66a2819564c00d25b26a8008dc49.specs │ │ ├── MJRefreshStateHeader_setLastUpdatedTimeKey:{instance}.49b3e932b043bc723eadea72e523c08a.specs │ │ ├── MJRefreshStateHeader_setState:{instance}.9e5202b000baef8593570a086f6041cc.specs │ │ ├── MJRefreshStateHeader_setTitle:forState:{instance}.7245f932111276c34a890fcd85654763.specs │ │ ├── MJRefreshStateHeader_stateLabel{instance}.0d68c4cd4f8dbfeb7f2359f4d961670f.specs │ │ ├── MJRefreshStateHeader_stateTitles{instance}.38ba9a44aa4289fe8e20bd9863f71a73.specs │ │ ├── NSObject_exchangeClassMethod1:method2:{class}.71d689a434ca09b8cb8f74bbec7f4eb5.specs │ │ ├── NSObject_exchangeInstanceMethod1:method2:{class}.96dfacd3a3ff34cf35523d85905b2d24.specs │ │ ├── UICollectionView_load{class}.d1e03b913041c5304ea6e6aaae62516c.specs │ │ ├── UICollectionView_mj_reloadData{instance}.9bef8e95c2259d92fdae989582bb1f01.specs │ │ ├── UILabel_label{class}.afa07640ba686955a2a7362d25bc45b7.specs │ │ ├── UIScrollView_executeReloadDataBlock{instance}.2ca85f7effafbea15ae2c2975b285598.specs │ │ ├── UIScrollView_footer{instance}.8fce697ac57901aefeb1dacc2f5a47fb.specs │ │ ├── UIScrollView_header{instance}.e36f42d4e2603c64553db7a0edc46a00.specs │ │ ├── UIScrollView_mj_contentH{instance}.24036d4daf4502909755d50e306cf8aa.specs │ │ ├── UIScrollView_mj_contentW{instance}.b233414ab82901bfa5e9c481f02eed57.specs │ │ ├── UIScrollView_mj_footer{instance}.ba19ff126339a1f9cc565424123dd04a.specs │ │ ├── UIScrollView_mj_header{instance}.de4dca3362b06a6fcebf0d4f8ea6605d.specs │ │ ├── UIScrollView_mj_insetB{instance}.027c674f176050465f25d28555c82310.specs │ │ ├── UIScrollView_mj_insetL{instance}.69019a4b689dc5e9480034298613a0c4.specs │ │ ├── UIScrollView_mj_insetR{instance}.8115b31217137fcbfb89f6bc0a2b4fbb.specs │ │ ├── UIScrollView_mj_insetT{instance}.dac71a98dc5d026ebd267231dbdea13e.specs │ │ ├── UIScrollView_mj_offsetX{instance}.add36016215f1fb4cf2e3cdb7c52da44.specs │ │ ├── UIScrollView_mj_offsetY{instance}.d3262116c9f7c7ee5e0b4e48645e0584.specs │ │ ├── UIScrollView_mj_reloadDataBlock{instance}.768a89e8546301059a84c1fcc484d254.specs │ │ ├── UIScrollView_mj_totalDataCount{instance}.6c960100dbafbe2ab276237e1d1d821d.specs │ │ ├── UIScrollView_setFooter:{instance}.228b084c44c3768d2822fc3e5ea603c3.specs │ │ ├── UIScrollView_setHeader:{instance}.0e813252b26bad8d7194457a9c6ba149.specs │ │ ├── UIScrollView_setMj_contentH:{instance}.834d14f06ceb43250beab703d0ccfc0a.specs │ │ ├── UIScrollView_setMj_contentW:{instance}.e5a6e3a2cd405961dfb5c0d27d352b8d.specs │ │ ├── UIScrollView_setMj_footer:{instance}.2cd77804053e8f9f52d938b68b3a588d.specs │ │ ├── UIScrollView_setMj_header:{instance}.bd1cfdba85638094043a7255cd38d0ea.specs │ │ ├── UIScrollView_setMj_insetB:{instance}.5a71cb186a3ec20d90f8bd47b9dac47d.specs │ │ ├── UIScrollView_setMj_insetL:{instance}.e64529e7d174d17a7bec9ddea732217e.specs │ │ ├── UIScrollView_setMj_insetR:{instance}.12aee9fa466171ca35f2b72511ac6b2c.specs │ │ ├── UIScrollView_setMj_insetT:{instance}.48d5cd4609dcdd5cff9a9c427036d431.specs │ │ ├── UIScrollView_setMj_offsetX:{instance}.e4bac092fb29b1d9c57a97f035e115ee.specs │ │ ├── UIScrollView_setMj_offsetY:{instance}.b20c4dbf093bd5a03175f1fa88401744.specs │ │ ├── UIScrollView_setMj_reloadDataBlock:{instance}.76ba198ea223a97ea4f70bb1841542da.specs │ │ ├── UITableView_load{class}.84c274c5438215fdde4219bec1285f66.specs │ │ ├── UITableView_mj_reloadData{instance}.8779ce6889d187a3a60ecee233b45a4d.specs │ │ ├── UIView_mj_h{instance}.ee1ab511f6d44208e5e19010a90366d1.specs │ │ ├── UIView_mj_origin{instance}.2920f5c507be706665b2cd16dee7bd48.specs │ │ ├── UIView_mj_size{instance}.1a606f4737e097976c18bab3c2937c8a.specs │ │ ├── UIView_mj_w{instance}.40d5044cb68b9af45a11d48702981b38.specs │ │ ├── UIView_mj_x{instance}.68420f3d9cbd6af5459acfe1f5ff8969.specs │ │ ├── UIView_mj_y{instance}.5ee543392493c0ac7824532a483f2ecb.specs │ │ ├── UIView_setMj_h:{instance}.e3c6b5717320a086e65063710338abec.specs │ │ ├── UIView_setMj_origin:{instance}.172127b30d28a15fd36a401db0f22d36.specs │ │ ├── UIView_setMj_size:{instance}.489fcf45b45f241ec7b42263ac5af8d5.specs │ │ ├── UIView_setMj_w:{instance}.f49ebde9182999565f9e96ae7c6f508c.specs │ │ ├── UIView_setMj_x:{instance}.055a79745f644de01d6f4b9ebac4198d.specs │ │ ├── UIView_setMj_y:{instance}.48f4dc71b9e738f0a240f9bf0482deb2.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______1.ac00e0b31d310500f8d60cbc5fe837d4.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______2.7bdf1a5d4cc5e5ba3c504eddfeac85db.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_drawRect:______3.471cb3b49d3a9cab6761cbe3ec1d252c.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4.429f1ffb7ec31f9a9c435111bc406f9c.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5.a41e476bf4b88c8e9f84999dce16c732.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6.dee26246d5e256df34bdf8b19b84cde7.specs │ │ ├── __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7.269aa7e8b4620722a518c763475e9f4f.specs │ │ ├── __objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______.409368d69a6b2c45cfe2d573b5fa37c4.specs │ │ ├── __objc_anonymous_block_MJRefreshAutoFooter_setState:______1.aedcdd766515748b002173dc90ceff19.specs │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______1.cfa28ad1b71153eff2ab2df148a9350c.specs │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______2.8de7ef77687044e540ac043423b63632.specs │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______3.b2c868550af9354ff62f3e4fc3848162.specs │ │ ├── __objc_anonymous_block_MJRefreshBackFooter_setState:______4.ab8afe779bff8ed6270e2d15f642c4fe.specs │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1.7522c36b71d1ab187151be463eff1098.specs │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2.c0b565ccdc6399fe31cea3f918a63d77.specs │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3.96e6d447a9ecb2dbbf0a435a452011fe.specs │ │ ├── __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4.fc556a200c10aeee80632a7de7f14568.specs │ │ ├── __objc_anonymous_block_MJRefreshComponent_beginRefreshing______1.21a03cc40ef29fea9c999c520e574567.specs │ │ ├── __objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2.ac25df20ab117714920dc4367d5da310.specs │ │ ├── __objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1.06e600200d9f03e2ae58f19c069e87ed.specs │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______1.d3a54c1db631c871b31b389567116d06.specs │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______2.76071b0d0f5e67c93ff3d61cf3a3789e.specs │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______3.8532e74d34f685982ae68b06d10fd8df.specs │ │ ├── __objc_anonymous_block_MJRefreshHeader_setState:______4.7d0f7a7a3eb581c034485e549b090838.specs │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______1.13050930c71724b7417ba383bb55c321.specs │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______2.1b4d0233230d9fceaa325a329806fc0d.specs │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______3.696a392bca56dbc6cc8c2c8a2eb661b9.specs │ │ ├── __objc_anonymous_block_MJRefreshNormalHeader_setState:______4.2249f9bd76235aa33803cf6005991b20.specs │ │ └── __objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue.c2d18021879fb88e6826d66a2b095c56.specs │ ├── stats.json │ └── toplevel.log ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── docs/ │ ├── README.md │ ├── architecture/ │ │ └── REPO_STRUCTURE.md │ └── legacy/ │ ├── bugs.md │ ├── opensource.md │ ├── other.md │ ├── reference.md │ └── suggestion.md ├── logo/ │ └── version1.0/ │ ├── BeeFun.sketch │ ├── bee.icns │ └── bee.iconsproj └── screenshot/ └── version1.0/ └── orginal/ └── desing/ └── screenshot.sketch ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata *.xccheckout *.moved-aside DerivedData *.hmap *.ipa *.xcuserstate # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control # BeeFun/Pods/ # Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build ================================================ FILE: BeeFun/.swiftlint.yml ================================================ disabled_rules: # 执行时排除掉的规则 - line_length - identifier_name - trailing_whitespace - empty_count - function_body_length opt_in_rules: # 一些规则仅仅是可选的 - missing_docs # 可以通过执行如下指令来查找所有可用的规则: # swiftlint rules included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。 excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。 - Carthage - Pods # 可配置的规则可以通过这个配置文件来自定义 # 二进制规则可以设置他们的严格程度 force_cast: warning # 隐式 force_try: severity: warning # 显式 # 同时有警告和错误等级的规则,可以只设置它的警告等级 # 隐式 line_length: 110 # 可以通过一个数组同时进行隐式设置 type_body_length: - 300 # warning - 1000 # error # 或者也可以同时进行显式设置 file_length: warning: 2000 error: 4000 # 命名规则可以设置最小长度和最大程度的警告/错误 # 此外它们也可以设置排除在外的名字 type_name: min_length: 4 # 只是警告 max_length: # 警告和错误 warning: 40 error: 50 excluded: # 排除某个名字 - iPhone - iOS - iPad - iOSVersion cyclomatic_complexity: 50 ================================================ FILE: BeeFun/BeeFun/AppDelegate.swift ================================================ // // AppDelegate.swift // BeeFun // // Created by wenghengcong on 15/12/22. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit import UserNotifications //import SwiftyStoreKit import OAuthSwift import Alamofire #if DEBUG //import GDPerformanceView_Swift #endif @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? var tabBarController: BFBaseTabBarController? class var sharedInstance: AppDelegate { return UIApplication.shared.delegate as! AppDelegate } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BFLanunchManager.shared.application(application, didFinishLaunchingWithOptions: launchOptions) window = UIWindow(frame: UIScreen.main.bounds) window?.backgroundColor = UIColor.white window?.makeKeyAndVisible() tabBarController = BFBaseTabBarController() window?.rootViewController = tabBarController //User Notification if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self } else { // Fallback on earlier versions } return true } // MARK: - Device token func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("device token \(deviceTokenString)") JPUSHService.registerDeviceToken(deviceToken) } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { print("did fail to register for remote notifications with error: \(error)") } // MARK: - iOS 10 以下 // MARK: Action Notification /** * Called when your app has been activated by the user selecting an action from a remote notification. * 8.0 above * 当操作交互式通知时,进入这里 */ func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable: Any], completionHandler: @escaping () -> Void) { completionHandler() } /** * Called when your app has been activated by the user selecting an action from a remote notification. * 9.0 above */ func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable: Any], withResponseInfo responseInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) { completionHandler() } /** * Called when your app has been activated by the user selecting an action from a local notification. * 8.0 above */ func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, completionHandler: @escaping () -> Void) { completionHandler() } /** * Called when your app has been activated by the user selecting an action from a local notification. * 9.0 above */ func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, withResponseInfo responseInfo: [AnyHashable: Any], completionHandler: @escaping () -> Void) { completionHandler() } // MARK: Local Notification /** * iOS 10之前,在前台,收到本地通知,会进入这里 * iOS 10之前,在后台,点击本地通知,会进入这里 * 假如未设置UNUserNotificationCenter代理,iOS 10收到本地通知也会进入这里。 */ func application(_ application: UIApplication, didReceive notification: UILocalNotification) { BFMessageManager.receiveLocalNotificaion(notification: notification) } /** * iOS 10之前,若未实现该代理application didReceiveRemoteNotification: fetchCompletionHandler: 不管在前台还是在后台,收到远程通知(包括静默通知)会进入didReceiveRemoteNotification代理方法; * 假如实现了,收到远程通知(包括静默通知)就会进入application didReceiveRemoteNotification: fetchCompletionHandler:方法 * 假如未设置UNUserNotificationCenter代理,iOS 10收到远程通知也会进入这里。 */ func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { BFMessageManager.receiveRemoteNotification(userInfo: userInfo) } /*! This delegate method offers an opportunity for applications with the "remote-notification" background mode to fetch appropriate new data in response to an incoming remote notification. You should call the fetchCompletionHandler as soon as you're finished performing that operation, so the system can accurately estimate its power and data cost. This method will be invoked even if the application was launched or resumed because of the remote notification. The respective delegate methods will be invoked first. Note that this behavior is in contrast to application:didReceiveRemoteNotification:, which is not called in those cases, and which will not be invoked if this method is implemented. !*/ /** * iOS 10之前,不管在前台还是在后台,收到远程通知会进入此处; * iOS 10之前,若未实现该代理,不管在前台还是在后台,收到远程通知会进入didReceiveRemoteNotification代理方法; * iOS 10之前,静默通知,会进入到这里; * iOS 10之后,在前台,静默通知,也会进入到这里 如果为设置代理,再调用- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler。 否则,不会调用上面方法; * iOS 10之后,在后台,收到静默推送,也会进到这里。 */ func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { } // MARK: - iOS 10 UNUserNotificationCenterDelegate /** * 在用户与你通知的通知进行交互时被调用,包括用户通过通知打开了你的应用,或者点击或者触发了某个action * 后台收到远程通知,点击进入 * 后台收到本地通知,点击进入 */ @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print(response) BFMessageManager.receiveResponse(response: response) completionHandler() } /** * 在前台如何处理,通过completionHandler指定。如果不想显示某个通知,可以直接用空 options 调用 completionHandler: // completionHandler(0) * 前台收到远程通知,进入这里 * 前台收到本地通知,进入这里 * 前台收到带有其他字段alert/sound/badge的静默通知,进入这里 * 后台收到静默通知不会调用该方法 */ @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print(notification) BFMessageManager.receiveNotification(notification: notification) // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置 let option = ( UNNotificationPresentationOptions.badge.rawValue|UNNotificationPresentationOptions.alert.rawValue|UNNotificationPresentationOptions.sound.rawValue ) completionHandler(UNNotificationPresentationOptions(rawValue: option)) } // MARK: - App Life cycle func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. BFLanunchManager.shared.applicationDidBecomeActive(application) } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } // MARK: - Open URL func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { //return UMSocialSnsService.handleOpen(url, wxApiDelegate: nil) applicationHandle(url: url) return true } func application(_ application: UIApplication, handleOpen url: URL) -> Bool { //return UMSocialSnsService.handleOpen(url) return true } func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { applicationHandle(url: url) return true } func applicationHandle(url: URL) { if url.host == AppOfficeShortSite { OAuthSwift.handle(url: url) } else { // Google provider is the only one wuth your.bundle.id url schema. OAuthSwift.handle(url: url) } } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "20x20", "idiom" : "iphone", "filename" : "bee-20x20@2x-1.png", "scale" : "2x" }, { "size" : "20x20", "idiom" : "iphone", "filename" : "bee-20x20@3x.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "bee-Small@2x-1.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "bee-Small@3x-1.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "bee-Small-40@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "bee-Small-40@3x.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "bee-60@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "bee-60@3x.png", "scale" : "3x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "bee-20x20.png", "scale" : "1x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "bee-20x20@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "bee-Small.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "bee-Small@2x-2.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "bee-Small-40.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "bee-HomeScreen-38-Long-Look.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "bee-76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "bee-76@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "bee-83.5@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", "filename" : "bee_1024-1.png", "scale" : "1x" }, { "size" : "24x24", "idiom" : "watch", "filename" : "bee-38-Notification.png", "scale" : "2x", "role" : "notificationCenter", "subtype" : "38mm" }, { "size" : "27.5x27.5", "idiom" : "watch", "filename" : "bee-42-Notification.png", "scale" : "2x", "role" : "notificationCenter", "subtype" : "42mm" }, { "size" : "29x29", "idiom" : "watch", "filename" : "bee-Small@2x.png", "role" : "companionSettings", "scale" : "2x" }, { "size" : "29x29", "idiom" : "watch", "filename" : "bee-Small@3x.png", "role" : "companionSettings", "scale" : "3x" }, { "size" : "40x40", "idiom" : "watch", "filename" : "bee-Small-40@2x-1.png", "scale" : "2x", "role" : "appLauncher", "subtype" : "38mm" }, { "size" : "44x44", "idiom" : "watch", "scale" : "2x", "role" : "appLauncher", "subtype" : "40mm" }, { "size" : "50x50", "idiom" : "watch", "scale" : "2x", "role" : "appLauncher", "subtype" : "44mm" }, { "size" : "86x86", "idiom" : "watch", "filename" : "bee-38-Short-Look.png", "scale" : "2x", "role" : "quickLook", "subtype" : "38mm" }, { "size" : "98x98", "idiom" : "watch", "filename" : "bee-42-Short-Look.png", "scale" : "2x", "role" : "quickLook", "subtype" : "42mm" }, { "size" : "108x108", "idiom" : "watch", "scale" : "2x", "role" : "quickLook", "subtype" : "44mm" }, { "size" : "1024x1024", "idiom" : "watch-marketing", "filename" : "bee_1024.png", "scale" : "1x" }, { "size" : "44x44", "idiom" : "watch", "filename" : "bee-42-Long-Look.png", "scale" : "2x", "role" : "longLook", "subtype" : "42mm" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Github/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_fork.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "git_fork@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_star.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "git_star@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Github/git_starred.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "git_starred@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Logo/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Logo/app_logo_90.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Artboard.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "Artboard@2x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Logo/github_signin_logo.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "signin_logo@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Logo/login_tip.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "login_tip.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_comment_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_comment_45@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_fork_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_fork_15@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_fork_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_person_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_person_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_repo_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_repo_15@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_repo_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_star_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_star_15@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_star_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_state_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_state_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicon_time_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_time_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_15/octicons_code_15.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_code_15@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicons_code_15@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_filesize_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_filesize_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_filesize_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_fork_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_fork_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_fork_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_issue_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_issue_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_issue_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_language_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_language_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_language_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_private_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_private_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_private_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_star_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_star_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_star_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicon_watch_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_watch_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_watch_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_20/octicons_code_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_code_20@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicons_code_20@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_branch_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "coticon_branch_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_home_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "coticon_home_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "coticon_home_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_repository_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "coticon_repos_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/coticon_tag_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_tag_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "coticon_tag_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_commit_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_commit_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_commit_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_issue_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_issue@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_loc_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_loc_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_loc_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_org_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_org_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_org_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_person_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_person_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_person_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_pull_request_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_pull_request@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_push_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_push_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicon_time_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_time_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_time_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_25/octicons_code_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_code_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicons_code_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_35/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_35/octicon_star_35.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_star_35@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_fork_red_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon-repo-forked_40_0_e31100_none.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon-repo-forked_60_0_e31100_none.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_fork_red_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_fork_red_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_fork_red_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_star_red_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon-star_40_0_e31100_none.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon-star_60_0_e31100_none.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_watch_red_20.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon-eye_40_0_e31100_none.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon-eye_60_0_e31100_none.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Octicon_Red/octicon_watch_red_25.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicon_watch_red_25@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "octicon_watch_red_25@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "template-rendering-intent" : "original" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_file.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_file@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_fork.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_fork@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_homepage.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "book.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "book-1.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_issue.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_issue@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_lan.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_lan@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_lock.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_lock@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_me.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "me (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "me.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_star.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_star@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_unlock.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_unlock@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/ReposDetail/repos_watch.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "repos_watch@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Tag/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Tag/set_tag_black.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "tag.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "tag (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Tag/tag_pop.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "chat.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/Tag/tags_add.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "tags_add@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "tags_add@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_home.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "user_home@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "home.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_loc.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "user_loc@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "position.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_org.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "user_org@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "building.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/UserDetail/user_time.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "clock (6).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "clock (5).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_down.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向下箭头.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向下箭头 (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_down_gray.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向下箭头 (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向下箭头.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_left.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向左箭头.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向左箭头 (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_left_gray.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向左箭头 (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向左箭头.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_right.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向右箭头 (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向右箭头.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_right_gray.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向右箭头.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向右箭头 (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_up.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向上箭头 (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向上箭头.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/arrow/arrow_up_gray.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "向上箭头.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "向上箭头 (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_cancel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "cancel (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "cancel.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_funnel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "funnel (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "funnel.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_funnel_sel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Filter Filled-60.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_seg_nor.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Combined Shape@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "Combined Shape@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_seg_sel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Group@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "Group@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/bar_icon/nav_share.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "share (3).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "share (2).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/network/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/network/empty_data.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Group@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "Group@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/network/network_error_1.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "constructocat2@2x.jpg", "scale" : "2x" }, { "idiom" : "universal", "filename" : "constructocat2@3x.jpg", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/network/network_error_2.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "network_error@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "network_error@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/octocat/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Assets.xcassets/octocat/benevocats.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "benevocats.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "benevocats3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: BeeFun/BeeFun/BeeFun-Bridging-Header.h ================================================ // // Use this file to import your target's public headers that you would like to expose to Swift. // //#import #import #import #import //==========ShareSDK头文件==================== #import #import //==========ShareSDKUI头文件,使用ShareSDK提供的UI需要导入===== #import #import //==========以下是各个平台SDK的头文件,根据需要继承的平台添加=== //腾讯开放平台(对应QQ和QQ空间)SDK头文件 #import #import #import "WXApi.h" #import "WeiboSDK.h" //新浪微博SDK需要在项目Build Settings中的Other Linker Flags添加"-ObjC" //#import "iCarousel.h" ================================================ FILE: BeeFun/BeeFun/BeeFun.entitlements ================================================ aps-environment development ================================================ FILE: BeeFun/BeeFun/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName BeeFun CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0.6 CFBundleSignature ???? CFBundleURLTypes CFBundleTypeRole Editor CFBundleURLName facebook CFBundleURLSchemes fb789261007875015 CFBundleTypeRole Editor CFBundleURLName weibo CFBundleURLSchemes wb1224249220 CFBundleTypeRole Editor CFBundleURLName weixin CFBundleURLSchemes wx9231f7e12ddac379 CFBundleTypeRole Editor CFBundleURLName qq CFBundleURLSchemes QQ41ED8968 CFBundleTypeRole Editor CFBundleURLName tencent CFBundleURLSchemes tencent1105263895 CFBundleTypeRole Editor CFBundleURLIconFile CFBundleURLName beefunios CFBundleURLSchemes beefunios CFBundleVersion 1153 Fabric APIKey e7fc6fe67f5ece8c9c70144eafeb17ac57c79885 Kits KitInfo KitName Answers KitInfo KitName Crashlytics FacebookAppID 789261007875015 FacebookDisplayName Coder LSApplicationQueriesSchemes alipayauth alipayqr alipay alipayshare wechat weixin sinaweibohd sinaweibo sinaweibosso sinaweibohdsso weibosdk weibosdk2.5 mqqapi mqq mqqOpensdkSSoLogin mqqconnect mqqopensdkdataline mqqopensdkgrouptribeshare mqqopensdkfriend mqqopensdkapi mqqopensdkapiV2 mqqopensdkapiV3 mqqopensdkapiV4 mqzoneopensdk wtloginmqq wtloginmqq2 mqqwpa mqzone mqzonev2 mqzoneshare wtloginqzone mqzonewx mqzoneopensdkapiV2 mqzoneopensdkapi19 mqzoneopensdkapi mqqbrowser mttbrowser fbapi fb-messenger-api fb-messenger fbauth fbauth2 fbshareextension LSRequiresIPhoneOS MOBAppSecret 480ba09dc992ae0234a0fef9183ff836 MOBAppkey 11b9cf1d0cec0 NSAppTransportSecurity NSAllowsArbitraryLoads NSExceptionDomains github.com NSExceptionAllowsInsecureHTTPLoads NSIncludesSubdomains jpush.cn NSExceptionAllowsInsecureHTTPLoads NSIncludesSubdomains akamaihd.net NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains facebook.com NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains fbcdn.net NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains qq.com NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains sina.com.cn NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains twitter.com twitter.com NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains weibo.cn NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains weibo.com NSExceptionAllowsInsecureHTTPLoads NSExceptionRequiresForwardSecrecy NSIncludesSubdomains NSPhotoLibraryUsageDescription BeeFun will access your photo library NSUbiquitousContainers iCloud.com.luci.beefun.mac NSUbiquitousContainerIsDocumentScopePublic NSUbiquitousContainerName BeeFun NSUbiquitousContainerSupportedFolderLevels Any UIBackgroundModes remote-notification UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UIRequiredDeviceCapabilities armv7 UIRequiresFullScreen UIStatusBarStyle UIStatusBarStyleLightContent UIStatusBarTintParameters UINavigationBar Style UIBarStyleDefault Translucent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIViewControllerBasedStatusBarAppearance ================================================ FILE: BeeFun/BeeFun/Model/BeeFunModel/BeeFunResponseModel.swift ================================================ // // BeeFunResponseModel.swift // BeeFun // // Created by WengHengcong on 2018/5/3. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BeeFunResponseModel: NSObject, Mappable { var code: Int? var codeEnum: BFStatusCode? var msg: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) code <- map["code"] if code != nil { codeEnum = BFStatusCode(rawValue: code!) } msg <- map["msg"] } } ================================================ FILE: BeeFun/BeeFun/Model/BeeFunModel/BeeFunTrendingResponseModel.swift ================================================ // // BeeFunTrendingResponseModel.swift // BeeFun // // Created by Hunt on 2019/6/25. // Copyright © 2019 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BeeFunTrendingResponseModel: NSObject, Mappable { var code: Int? var codeEnum: BFStatusCode? var msg: String? var data: [BFGithubTrengingModel]? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) code <- map["code"] if code != nil { codeEnum = BFStatusCode(rawValue: code!) } msg <- map["msg"] data <- map["data"] } } ================================================ FILE: BeeFun/BeeFun/Model/BeeFunModel/GetAllTagResponse.swift ================================================ // // GetAllTagResponse.swift // BeeFun // // Created by WengHengcong on 2018/5/3. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class GetAllTagResponse: BeeFunResponseModel { var data: [ObjTag]? required init?(map: Map) { super.init(map: map) } override func mapping(map: Map) { super.mapping(map: map) data <- map["data"] } } ================================================ FILE: BeeFun/BeeFun/Model/BeeFunModel/GetReposResponse.swift ================================================ // // GetReposResponse.swift // BeeFun // // Created by WengHengcong on 2018/5/12. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class GetReposResponse: BeeFunResponseModel { var data: [ObjRepos]? required init?(map: Map) { super.init(map: map) } override func mapping(map: Map) { super.mapping(map: map) data <- map["data"] } } ================================================ FILE: BeeFun/BeeFun/Model/BeeFunModel/ObjTag.swift ================================================ // // ObjTagModel.swift // BeeFun // // Created by WengHengcong on 2018/5/3. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper public class ObjTag: NSObject, Mappable, NSCopying { public func copy(with zone: NSZone? = nil) -> Any { let newCopy = ObjTag() newCopy.name = name newCopy.owner = owner newCopy.count = count newCopy.sort = sort newCopy.repos = repos newCopy.created_at = created_at newCopy.updated_at = updated_at return newCopy } var name: String? var owner: String? var count: Int? var sort: Int? var repos: String? var created_at: Int64? var updated_at: Int64? required public init?(map: Map) { } override init() { super.init() } public func mapping(map: Map) { name <- map["name"] owner <- map["owner"] count <- map["count"] sort <- map["sort"] repos <- map["repos"] created_at <- map["created_at"] updated_at <- map["updated_at"] } } ================================================ FILE: BeeFun/BeeFun/Model/DataModel.swift ================================================ // // DataModel.swift // BeeFun // // Created by wenghengcong on 16/1/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Foundation class DataModel: NSObject { } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjAsset.swift ================================================ // // ObjAsset.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "url": "https://api.github.com/repos/octocat/Hello-World/releases/assets/1", "browser_download_url": "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip", "id": 1, "name": "example.zip", "label": "short description", "state": "uploaded", "content_type": "application/zip", "size": 1024, "download_count": 42, "created_at": "2013-02-27T19:35:32Z", "updated_at": "2013-02-27T19:35:32Z", "uploader": { "login": "octocat", "id": 1, "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false } } */ class ObjAsset: Mappable { var url: String? var browser_download_url: String? var id: ObjUser? var name: String? var label: String? var state: Bool? var content_type: String? var size: Int? var download_count: Int? var created_at: Bool? var updated_at: String? var uploader: ObjUser? required init?(map: Map) { } func mapping(map: Map) { url <- map["url"] browser_download_url <- map["browser_download_url"] id <- map["id"] name <- map["name"] label <- map["label"] state <- map["state"] content_type <- map["content_type"] size <- map["size"] download_count <- map["download_count"] created_at <- map["created_at"] updated_at <- map["updated_at"] uploader <- map["uploader"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjBranch.swift ================================================ // // ObjHead.swift // BeeFun // // Created by WengHengcong on 15/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "label": "new-topic", "ref": "new-topic", "sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e", "user": { } "repo": { } } */ class ObjBranch: NSObject, Mappable { var label: String? var ref: String? var sha: String? var user: ObjUser? var repo: ObjRepos? required init?(map: Map) { } func mapping(map: Map) { label <- map["label"] ref <- map["ref"] user <- map["user"] repo <- map["repo"] sha <- map["sha"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjComment.swift ================================================ // // ObjComment.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** * { "html_url": "https://github.com/octocat/Hello-World/commit/6dcb09b5b57875f334f61aebed695e2e4193db5e#commitcomment-1", "url": "https://api.github.com/repos/octocat/Hello-World/comments/1", "id": 1, "body": "Great stuff", "path": "file1.txt", "position": 4, "line": 14, "commit_id": "6dcb09b5b57875f334f61aebed695e2e4193db5e", "user": {}, "created_at": "2011-04-14T16:00:49Z", "updated_at": "2011-04-14T16:00:49Z" } */ import UIKit import ObjectMapper class ObjComment: NSObject, Mappable { var url: String? var html_url: String? var issue_url: String? var id: Int? var user: ObjUser? var created_at: String? var updated_at: String? var body: String? var position: Int? var line: String? var path: String? var commit_id: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) url <- map["url"] html_url <- map["html_url"] issue_url <- map["issue_url"] id <- map["id"] user <- map["user"] created_at <- map["created_at"] updated_at <- map["updated_at"] body <- map["body"] position <- map["position"] line <- map["line"] path <- map["path"] commit_id <- map["commit_id"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjCommit.swift ================================================ // // ObjCommit.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* "sha": "134f57a577b4dc45a29818d11d2484c549a86ac0", "author":ObjUser, "message": "starred repos done", "distinct": true, "url": "https://api.github.com/repos/wenghengcong/BeeFun/commits/134f57a577b4dc45a29818d11d2484c549a86ac0" */ class ObjCommit: NSObject, Mappable { var sha: String? var author: ObjUser? var message: String? var distinct: Bool? var url: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) sha <- map["sha"] author <- map["author"] message <- map["message"] distinct <- map["distinct"] url <- map["url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjDeployment.swift ================================================ // // ObjDeployment.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692", "id": 710692, "sha": "9049f1265b7d61be4a8904a9a27120d2064dab3b", "ref": "master", "task": "deploy", "payload": { }, "environment": "production", "description": null, "creator": { }, "created_at": "2015-05-05T23:40:38Z", "updated_at": "2015-05-05T23:40:38Z", "statuses_url": "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses", "repository_url": "https://api.github.com/repos/baxterthehacker/public-repo" } */ class ObjDeployment: Mappable { var url: String? var sha: String? var id: Int? var ref: String? var task: String? var payload: ObjDeploymentPayload? var environment: String? var description: String? var creator: ObjUser? var created_at: String? var updated_at: String? var statuses_url: String? var repository_url: String? required init?(map: Map) { } func mapping(map: Map) { url <- map["url"] sha <- map["sha"] id <- map["id"] ref <- map["ref"] task <- map["task"] payload <- map["payload"] environment <- map["environment"] description <- map["description"] creator <- map["creator"] created_at <- map["created_at"] updated_at <- map["updated_at"] statuses_url <- map["statuses_url"] repository_url <- map["repository_url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjDeploymentPayload.swift ================================================ // // ObjDeploymentPayload.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class ObjDeploymentPayload: Mappable { var task: String? required init?(map: Map) { } func mapping(map: Map) { task <- map["url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjEvent.swift ================================================ // // ObjEvent.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** { "id": "3675348721", "type": "IssueCommentEvent", "actor":ObjUser, "repo":ObjRepos, "payload": ObjEventPayload, "public": true, "created_at": "2016-02-22T23:11:00Z" } */ import UIKit import ObjectMapper /// Event /// /// - commitCommentEvent: Triggered when a commit comment is created /// - createEvent: Represents a created repository, branch, or tag. /// - deleteEvent: Represents a deleted branch or tag. /// - deploymentEvent: <#deploymentEvent description#> /// - deploymentStatusEvent: <#deploymentStatusEvent description#> /// - downloadEvent: <#downloadEvent description#> /// - followEvent: <#followEvent description#> /// - forkEvent: <#forkEvent description#> /// - forkApplyEvent: <#forkApplyEvent description#> /// - gistEvent: <#gistEvent description#> /// - gollumEvent: <#gollumEvent description#> /// - installationEvent: <#installationEvent description#> /// - installationRepositoriesEvent: <#installationRepositoriesEvent description#> /// - issuesEvent: <#issuesEvent description#> /// - issueCommentEvent: <#issueCommentEvent description#> /// - labelEvent: <#labelEvent description#> /// - marketplacePurchaseEvent: <#marketplacePurchaseEvent description#> /// - memberEvent: <#memberEvent description#> /// - membershipEvent: <#membershipEvent description#> /// - milestoneEvent: <#milestoneEvent description#> /// - organizationEvent: <#organizationEvent description#> /// - OrgBlockEvent: <#OrgBlockEvent description#> /// - pageBuildEvent: <#pageBuildEvent description#> /// - projectCardEvent: <#projectCardEvent description#> /// - projectColumnEvent: <#projectColumnEvent description#> /// - projectEvent: <#projectEvent description#> /// - publicEvent: <#publicEvent description#> /// - pullRequestEvent: <#pullRequestEvent description#> /// - pullRequestReviewEvent: <#pullRequestReviewEvent description#> /// - pullRequestReviewCommentEvent: <#pullRequestReviewCommentEvent description#> /// - pushEvent: <#pushEvent description#> /// - releaseEvent: <#releaseEvent description#> /// - repositoryEvent: <#repositoryEvent description#> /// - statusEvent: <#statusEvent description#> /// - teamEvent: <#teamEvent description#> /// - teamAddEvent: <#teamAddEvent description#> /// - watchEvent: <#watchEvent description#> public enum EventType: String { case commitCommentEvent = "CommitCommentEvent" case createEvent = "CreateEvent" case deleteEvent = "DeleteEvent" case deploymentEvent = "DeploymentEvent" case deploymentStatusEvent = "DeploymentStatusEvent" case downloadEvent = "DownloadEvent" case followEvent = "FollowEvent" case forkEvent = "ForkEvent" case forkApplyEvent = "ForkApplyEvent" case gistEvent = "GistEvent" case gollumEvent = "GollumEvent" case installationEvent = "InstallationEvent" case installationRepositoriesEvent = "InstallationRepositoriesEvent" case issuesEvent = "IssuesEvent" case issueCommentEvent = "IssueCommentEvent" case labelEvent = "LabelEvent" case marketplacePurchaseEvent = "MarketplacePurchaseEvent" case memberEvent = "MemberEvent" case membershipEvent = "MembershipEvent" case milestoneEvent = "MilestoneEvent" case organizationEvent = "OrganizationEvent" case OrgBlockEvent = "OrgBlockEvent" case pageBuildEvent = "PageBuildEvent" case projectCardEvent = "ProjectCardEvent" case projectColumnEvent = "ProjectColumnEvent" case projectEvent = "ProjectEvent" case publicEvent = "PublicEvent" case pullRequestEvent = "PullRequestEvent" case pullRequestReviewEvent = "PullRequestReviewEvent" case pullRequestReviewCommentEvent = "PullRequestReviewCommentEvent" case pushEvent = "PushEvent" case releaseEvent = "ReleaseEvent" case repositoryEvent = "RepositoryEvent" case statusEvent = "StatusEvent" case teamEvent = "TeamEvent" case teamAddEvent = "TeamAddEvent" case watchEvent = "WatchEvent" } public enum CreateEventType: String { case CreateRepositoryEvent = "repository" case CreateBranchEvent = "branch" case CreateTagEvent = "tag" } class ObjEvent: NSObject, Mappable { var id: String? var type: EventType? var actor: ObjUser? var repo: ObjRepos? var payload: ObjEventPayload? var org: ObjUser? var cpublic: Bool? //"public" is keyword,so add "c" prefix var created_at: String? //TODO: org is organization //var org:String? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) id <- map["id"] type <- map["type"] actor <- map["actor"] org <- map["org"] repo <- map["repo"] payload <- map["payload"] cpublic <- map["public"] created_at <- map["created_at"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjEventPayload.swift ================================================ // // ObjEventPayload.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** { "action": "created", "issue":ObjIssue, "comment": ObjComment, } */ import UIKit import ObjectMapper enum EventAction: String { //GistEvent case create //GistEvent case update //GollumEvent/InstallationEvent/IssueCommentEvent/LabelEvent //MilestoneEvent/ProjectCardEvent/ProjectColumnEvent //ProjectEvent/PullRequestReviewCommentEvent //RepositoryEvent/TeamEvent case created //GollumEvent/IssueCommentEvent/IssuesEvent/LabelEvent //MemberEvent/MilestoneEvent/ProjectCardEvent/ProjectColumnEvent //ProjectEvent/PullRequestEvent/PullRequestReviewEvent //PullRequestReviewCommentEvent/TeamEvent case edited //InstallationEvent/IssueCommentEvent/LabelEvent //MemberEvent/MilestoneEvent/ProjectCardEvent/ProjectColumnEvent //ProjectEvent/PullRequestReviewCommentEvent //RepositoryEvent/TeamEvent case deleted //InstallationRepositoriesEvent/MemberEvent/MembershipEvent //MembershipEvent case added //InstallationRepositoriesEvent case removed //IssuesEvent case milestoned //IssuesEvent case demilestoned //IssuesEvent case labeled //IssuesEvent case unlabeled //IssuesEvent/PullRequestEvent case assigned //IssuesEvent/PullRequestEvent case unassigned //IssuesEvent/ProjectEvent/PullRequestEvent case reopened //IssuesEvent/MilestoneEvent/PullRequestEvent case opened //IssuesEvent/MilestoneEvent/ProjectEvent/PullRequestEvent case closed //MarketplacePurchaseEvent case purchased //MarketplacePurchaseEvent case cancelled //MarketplacePurchaseEvent case changed //OrganizationEvent case member_added //OrganizationEvent case member_removed //OrganizationEvent case member_invited //OrgBlockEvent case blocked //OrgBlockEvent case unblocked //ProjectCardEvent case converted //ProjectCardEvent/ProjectColumnEvent case moved //PullRequestEvent case review_requested //PullRequestEvent case review_request_removed //PullRequestReviewEvent case submitted //PullRequestReviewEvent case dismissed //ReleaseEvent case published //RepositoryEvent case publicized //RepositoryEvent case privatized //TeamEvent case added_to_repository //TeamEvent case removed_from_repository //WatchEvent case started } class ObjEventPayload: NSObject, Mappable { var action: EventAction? var issue: ObjIssue? var comment: ObjComment? var ref: String? var ref_type: String? var master_branch: String? var cdescription: String? var pusher_type: String? var sender: ObjUser? var push_id: Int? var size: Int? var distinct_size: Int? var head: String? var before: String? var commits: [ObjCommit]? var member: ObjMember? var pull_request: ObjPullRequest? var number: Int? var cpublic: Bool? //对应public,添加c为前缀 var release: ObjRelease? var forkee: ObjRepos? //GollumEvent var pages: [ObjPage]? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) action <- map["action"] issue <- map["issue"] comment <- map["comment"] ref <- map["ref"] ref_type <- map["ref_type"] master_branch <- map["master_branch"] cdescription <- map["description"] pusher_type <- map["pusher_type"] sender <- map["sender"] push_id <- map["push_id"] size <- map["size"] distinct_size <- map["distinct_size"] head <- map["head"] before <- map["before"] commits <- map["commits"] number <- map["number"] cpublic <- map["public"] pull_request <- map["pull_request"] release <- map["release"] member <- map["member"] forkee <- map["forkee"] pages <- map["pages"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjHref.swift ================================================ // // ObjHref.swift // BeeFun // // Created by WengHengcong on 15/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347" } */ class ObjHref: NSObject, Mappable { var href: String? required init?(map: Map) { } func mapping(map: Map) { href <- map["href"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjLinks.swift ================================================ // // ObjLinks.swift // BeeFun // // Created by WengHengcong on 15/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "self": { "href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347" }, "html": { "href": "https://github.com/octocat/Hello-World/pull/1347" }, "issue": { "href": "https://api.github.com/repos/octocat/Hello-World/issues/1347" }, "comments": { "href": "https://api.github.com/repos/octocat/Hello-World/issues/1347/comments" }, "review_comments": { "href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments" }, "review_comment": { "href": "https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}" }, "commits": { "href": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits" }, "statuses": { "href": "https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e" } } */ class ObjLinks: NSObject, Mappable { var cself: ObjHref? var html: ObjHref? var issue: ObjHref? var comments: ObjHref? var review_comments: ObjHref? var review_comment: ObjHref? var commits: ObjHref? var statuses: ObjHref? required init?(map: Map) { } func mapping(map: Map) { cself <- map["self"] html <- map["html"] issue <- map["issue"] comments <- map["comments"] review_comments <- map["sha"] review_comment <- map["sha"] commits <- map["sha"] statuses <- map["sha"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjMember.swift ================================================ // // ObjMember.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "avatar_url": "https://avatars1.githubusercontent.com/u/170270?v=4", "events_url": "https://api.github.com/users/sindresorhus/events{/privacy}", "followers_url": "https://api.github.com/users/sindresorhus/followers", "following_url": "https://api.github.com/users/sindresorhus/following{/other_user}", "gists_url": "https://api.github.com/users/sindresorhus/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/sindresorhus", "id": 170270, "login": "sindresorhus", "organizations_url": "https://api.github.com/users/sindresorhus/orgs", "received_events_url": "https://api.github.com/users/sindresorhus/received_events", "repos_url": "https://api.github.com/users/sindresorhus/repos", "site_admin": false, "starred_url": "https://api.github.com/users/sindresorhus/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/sindresorhus/subscriptions", "type": "User", "url": "https://api.github.com/users/sindresorhus" } */ class ObjMember: Mappable { var avatar_url: String? var events_url: String? var followers_url: Int? var following_url: String? var gists_url: String? var gravatar_id: String? var html_url: String? var id: Int? var login: String? var organizations_url: String? var received_events_url: String? var repos_url: String? var site_admin: Bool? var starred_url: String? var subscriptions_url: String? var type: String? var url: String? required init?(map: Map) { } func mapping(map: Map) { avatar_url <- map["avatar_url"] events_url <- map["events_url"] followers_url <- map["followers_url"] following_url <- map["following_url"] gists_url <- map["gists_url"] gravatar_id <- map["gravatar_id"] html_url <- map["html_url"] id <- map["id"] organizations_url <- map["organizations_url"] received_events_url <- map["received_events_url"] repos_url <- map["repos_url"] site_admin <- map["site_admin"] starred_url <- map["starred_url"] subscriptions_url <- map["subscriptions_url"] type <- map["type"] url <- map["url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjNotification.swift ================================================ // // ObjNotification.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** { "id": "125784581", "unread": true, "reason": "subscribed", "updated_at": "2016-02-22T18:22:41Z", "last_read_at": null, "subject":ObjSubject "repository": ObjRepos, "url": "https://api.github.com/notifications/threads/125784581", "subscription_url": "https://api.github.com/notifications/threads/125784581/subscription" } */ import UIKit import ObjectMapper public enum NotificationReason: String { case Subscribed = "subscribed" case Manual = "manual" case Author = "author" case Comment = "comment" case Mention = "mention" case TeamMention = "team_mention" case StateChange = "state_change" case Assign = "assign" } class ObjNotification: NSObject, Mappable { var id: String? var unread: Bool? var reason: String? var updated_at: String? var last_read_at: String? var subject: ObjSubject? var repository: ObjRepos? var url: String? var subscription_url: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) id <- map["id"] unread <- map["unread"] reason <- map["reason"] updated_at <- map["updated_at"] last_read_at <- map["last_read_at"] subject <- map["subject"] repository <- map["repository"] url <- map["url"] subscription_url <- map["subscription_url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjPage.swift ================================================ // // ObjPage.swift // BeeFun // // Created by WengHengcong on 14/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "action": "edited", "html_url": "https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide", "page_name": "AFNetworking-3.0-Migration-Guide", "sha": "2d4cab76bc2bb73c890ebada2d53b614f0945635", "summary": null, "title": "AFNetworking 3.0 Migration Guide" } */ class ObjPage: Mappable { var action: String? var html_url: String? var page_name: String? var sha: String? var summary: String? var title: String? required init?(map: Map) { } func mapping(map: Map) { action <- map["action"] html_url <- map["html_url"] page_name <- map["page_name"] sha <- map["sha"] summary <- map["summary"] title <- map["title"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjPullRequest.swift ================================================ // // ObjPullRequest.swift // BeeFun // // Created by WengHengcong on 15/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "id": 1, "url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347", "html_url": "https://github.com/octocat/Hello-World/pull/1347", "diff_url": "https://github.com/octocat/Hello-World/pull/1347.diff", "patch_url": "https://github.com/octocat/Hello-World/pull/1347.patch", "issue_url": "https://api.github.com/repos/octocat/Hello-World/issues/1347", "commits_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits", "review_comments_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments", "review_comment_url": "https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}", "comments_url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/comments", "statuses_url": "https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e", "number": 1347, "state": "open", "title": "new-feature", "body": "Please pull these awesome changes", "assignee": { }, "milestone": { }, "locked": false, "created_at": "2011-01-26T19:01:12Z", "updated_at": "2011-01-26T19:01:12Z", "closed_at": "2011-01-26T19:01:12Z", "merged_at": "2011-01-26T19:01:12Z", "head": { }, "base": { }, "_links": { }, "user": { } } */ class ObjPullRequest: NSObject, Mappable { var id: Int? var _links: ObjLinks? var url: String? var html_url: String? var diff_url: String? var patch_url: String? var issue_url: String? var commits_url: String? var review_comments_url: String? var review_comment_url: String? var comments_url: String? var statuses_url: String? var body: String? var number: Int? var state: String? var locked: Int? var title: String? var additions: Int? var milestone: ObjMilestone? var created_at: String? var updated_at: String? var closed_at: String? var merged_at: String? var merge_commit_sha: String? //值可为:OWNER、NONE、 CONTRIBUTOR、COLLABORATOR var author_association: String? var assignee: ObjUser? var assignees: [ObjUser]? var base: ObjBranch? var head: ObjBranch? var changed_files: Int? var comments: Int? var commits: Int? var deletions: Int? var maintainer_can_modify: Bool? var mergeable_state: String? var merged: Bool? var merged_by: ObjUser? var rebaseable: Bool? var review_comments: Int? var mergeable: Bool? //不确定以下值类型 var requested_reviewers: [ObjUser]? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) id <- map["id"] _links <- map["_links"] url <- map["url"] html_url <- map["html_url"] diff_url <- map["diff_url"] patch_url <- map["patch_url"] issue_url <- map["issue_url"] commits_url <- map["commits_url"] review_comments_url <- map["review_comments_url"] review_comment_url <- map["review_comment_url"] comments_url <- map["comments_url"] statuses_url <- map["statuses_url"] body <- map["body"] number <- map["number"] state <- map["state"] locked <- map["locked"] title <- map["title"] milestone <- map["milestone"] additions <- map["additions"] created_at <- map["created_at"] updated_at <- map["updated_at"] closed_at <- map["closed_at"] merged_at <- map["merged_at"] merge_commit_sha <- map["merge_commit_sha"] author_association <- map["author_association"] assignee <- map["assignee"] assignees <- map["assignees"] base <- map["base"] head <- map["head"] changed_files <- map["changed_files"] comments <- map["comments"] commits <- map["commits"] deletions <- map["deletions"] maintainer_can_modify <- map["maintainer_can_modify"] mergeable_state <- map["mergeable_state"] merged <- map["merged"] merged_by <- map["merged_by"] rebaseable <- map["rebaseable"] review_comments <- map["review_comments"] mergeable <- map["mergeable"] requested_reviewers <- map["requested_reviewers"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjRelease.swift ================================================ // // ObjRelease.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "assets": [], "assets_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095/assets", "author": { }, "body": "\r\n [FIX] added connectTo:", "created_at": "2017-09-21T04:42:48Z", "draft": false, "html_url": "https://github.com/ckrey/MQTT-Client-Framework/releases/tag/0.9.9", "id": 7834095, "name": "Session Manager and CoreDataPersistence", "prerelease": false, "published_at": "2017-09-21T04:44:14Z", "tag_name": "0.9.9", "tarball_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/tarball/0.9.9", "target_commitish": "master", "upload_url": "https://uploads.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095/assets{?name,label}", "url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/releases/7834095", "zipball_url": "https://api.github.com/repos/ckrey/MQTT-Client-Framework/zipball/0.9.9" } */ class ObjRelease: Mappable { var assets: [ObjAsset]? var assets_url: String? var author: ObjUser? var body: String? var created_at: String? var draft: Bool? var html_url: String? var id: Int? var name: String? var prerelease: Bool? var published_at: String? var tag_name: String? var tarball_url: String? var target_commitish: String? var upload_url: String? var url: String? var zipball_url: String? required init?(map: Map) { } func mapping(map: Map) { assets <- map["assets"] assets_url <- map["assets_url"] author <- map["author"] body <- map["body"] created_at <- map["created_at"] draft <- map["draft"] html_url <- map["html_url"] id <- map["id"] name <- map["name"] prerelease <- map["prerelease"] published_at <- map["published_at"] tag_name <- map["tag_name"] tarball_url <- map["tarball_url"] target_commitish <- map["target_commitish"] upload_url <- map["upload_url"] url <- map["url"] zipball_url <- map["zipball_url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjSearchCode.swift ================================================ // // ObjSearchCode.swift // BeeFun // // Created by WengHengcong on 11/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "git_url": "https://api.github.com/repositories/91869205/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3", "html_url": "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift", "name": "UISegmentedControlExtensionsTests.swift", "path": "Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift", "repository": { ......, "owner": { }, }, "score": 4.027219, "sha": "ebcf232789ff70f5e78a401cba3646216a1e20c3", "url": "https://api.github.com/repositories/91869205/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508" }, */ // MARK: - 更为完整的属性 /* git_url->的结果,其中content是搜索到的代码,base64加密后的显示 { sha: "ebcf232789ff70f5e78a401cba3646216a1e20c3", size: 885, url: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3", content: "Ly8KLy8gIFVJU2VnbWVudGVkQ29udHJvbEV4dGVuc2lvbnNUZXN0cy5zd2lm dAovLyAgU3dpZnRlclN3aWZ0Ci8vCi8vICBDcmVhdGVkIGJ5IFN0ZXZlbiBv biAyLzE1LzE3LgovLyAgQ29weXJpZ2h0IMKpIDIwMTcgb21hcmFsYmVpay4g QWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KCiNpZiBvcyhpT1MpIHx8IG9zKHR2 T1MpCgppbXBvcnQgWENUZXN0CkB0ZXN0YWJsZSBpbXBvcnQgU3dpZnRlclN3 aWZ0CgpjbGFzcyBVSVNlZ21lbnRlZENvbnRyb2xFeHRlbnNpb25zVGVzdHM6 IFhDVGVzdENhc2UgewoKICAgIGZ1bmMgdGVzdFNlZ21lbnRUaXRsZXMoKSB7 CiAgICAgICAgbGV0IHNlZ21lbnRDb250cm9sID0gVUlTZWdtZW50ZWRDb250 cm9sKCkKICAgICAgICBYQ1RBc3NlcnQoc2VnbWVudENvbnRyb2wuc2VnbWVu dFRpdGxlcy5pc0VtcHR5KQogICAgICAgIGxldCB0aXRsZXMgPSBbIlRpdGxl MSIsICJUaXRsZTIiXQogICAgICAgIHNlZ21lbnRDb250cm9sLnNlZ21lbnRU aXRsZXMgPSB0aXRsZXMKICAgICAgICBYQ1RBc3NlcnRFcXVhbChzZWdtZW50 Q29udHJvbC5zZWdtZW50VGl0bGVzLCB0aXRsZXMpCiAgICB9CiAgICAKICAg IGZ1bmMgdGVzdFNlZ21lbnRJbWFnZXMoKSB7CiAgICAgICAgbGV0IHNlZ21l bnRDb250cm9sID0gVUlTZWdtZW50ZWRDb250cm9sKCkKICAgICAgICBYQ1RB c3NlcnQoc2VnbWVudENvbnRyb2wuc2VnbWVudEltYWdlcy5pc0VtcHR5KQog ICAgICAgIGxldCBpbWFnZXMgPSBbVUlJbWFnZSgpLCBVSUltYWdlKCldCiAg ICAgICAgc2VnbWVudENvbnRyb2wuc2VnbWVudEltYWdlcyA9IGltYWdlcwog ICAgICAgIFhDVEFzc2VydEVxdWFsKHNlZ21lbnRDb250cm9sLnNlZ21lbnRJ bWFnZXMsIGltYWdlcykKICAgIH0KfQojZW5kaWYK ", encoding: "base64" } */ /* url-> 更为完整的代码片段的属性 name: "UISegmentedControlExtensionsTests.swift", path: "Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift", sha: "ebcf232789ff70f5e78a401cba3646216a1e20c3", size: 885, url: "https://api.github.com/repos/cohena100/Shimi/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508", html_url: "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift", git_url: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3", download_url: "https://raw.githubusercontent.com/cohena100/Shimi/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift", type: "file", content: " ", encoding: "base64", _links: { self: "https://api.github.com/repos/cohena100/Shimi/contents/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift?ref=63aff29a6e822588f3a8cb6f080c8021405dd508", git: "https://api.github.com/repos/cohena100/Shimi/git/blobs/ebcf232789ff70f5e78a401cba3646216a1e20c3", html: "https://github.com/cohena100/Shimi/blob/63aff29a6e822588f3a8cb6f080c8021405dd508/Carthage/Checkouts/SwifterSwift/Tests/SwifterSwiftTests/UIKitExtensionsTests/UISegmentedControlExtensionsTests.swift" } } */ class ObjSearchCode: NSObject, Mappable { /// 获取后得到该代码的部分属性 var git_url: String? /// 可以显示代码的网址,跳转打开的页面 var html_url: String? var name: String? var path: String? var repository: ObjRepos? var score: Double? var sha: String? /// 获取后得到该代码的全部属性 var url: String? required init?(map: Map) { } func mapping(map: Map) { git_url <- map["git_url"] html_url <- map["html_url"] name <- map["name"] path <- map["path"] repository <- map["repository"] score <- map["score"] sha <- map["sha"] url <- map["url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Event/ObjSubject.swift ================================================ // // ObjSubject.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** "title": "marked designated initializers (issue #1142)", "url": "https://api.github.com/repos/jessesquires/JSQMessagesViewController/pulls/1460", "latest_comment_url": "https://api.github.com/repos/jessesquires/JSQMessagesViewController/pulls/1460", "type": "PullRequest" */ import UIKit import ObjectMapper public enum SubjectType: String { case issue = "Issue" case pullRequest = "PullRequest" case release = "Release" case commit = "Commit" } class ObjSubject: NSObject, Mappable { var title: String? var url: String? var latest_comment_url: String? var type: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) title <- map["title"] url <- map["url"] latest_comment_url <- map["latest_comment_url"] type <- map["type"] } } ================================================ FILE: BeeFun/BeeFun/Model/Issue/ObjIssue.swift ================================================ // // ObjIssue.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** { "url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2", "repository_url": "https://api.github.com/repos/wenghengcong/TestForCoder", "labels_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/labels{/name}", "comments_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/comments", "events_url": "https://api.github.com/repos/wenghengcong/TestForCoder/issues/2/events", "html_url": "https://github.com/wenghengcong/TestForCoder/issues/2", "id": 135574763, "number": 2, "title": "Issue 2", "user": ObjUser, "labels": [], "state": "open", "locked": false, "assignee": null, "milestone": null, "comments": 1, "created_at": "2016-02-22T23:11:00Z", "updated_at": "2016-02-22T23:11:15Z", "closed_at": null, "repository": ObjRepos "closed_by":ObjUser "pull_request":ObjPullRequest "body": "@wenghengcong\r\nnoti user" } */ import UIKit import ObjectMapper class ObjIssue: NSObject, Mappable { var url: String? var repository_url: String? var labels_url: String? var comments_url: String? var events_url: String? var html_url: String? var id: Int? var number: Int? var title: String? var user: ObjUser? var labels: [ObjLabel]? var state: String? var locked: Bool? var assignee: ObjUser? var assignees: [ObjUser]? var milestone: ObjMilestone? var comments: Int? var created_at: String? var updated_at: String? var closed_at: String? var repository: ObjRepos? var closed_by: ObjUser? var pull_request: ObjPullRequest? var body: String? var score: Double? //值可为:OWNER、NONE、 CONTRIBUTOR、COLLABORATOR var author_association: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) url <- map["url"] repository_url <- map["repository_url"] labels_url <- map["labels_url"] comments_url <- map["comments_url"] events_url <- map["events_url"] html_url <- map["html_url"] id <- map["id"] number <- map["number"] title <- map["title"] user <- map["user"] labels <- map["labels"] state <- map["state"] locked <- map["locked"] assignee <- map["assignee"] assignees <- map["assignees"] milestone <- map["milestone"] comments <- map["comments"] created_at <- map["created_at"] updated_at <- map["updated_at"] closed_at <- map["closed_at"] repository <- map["repository"] closed_by <- map["closed_by"] pull_request <- map["pull_request"] body <- map["body"] score <- map["score"] //搜索匹配得分 author_association <- map["author_association"] } } ================================================ FILE: BeeFun/BeeFun/Model/Issue/ObjLabel.swift ================================================ // // ObjLabel.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /** * "url": "https://api.github.com/repos/octocat/Hello-World/labels/bug", "name": "bug", "color": "f29513" */ import UIKit import ObjectMapper class ObjLabel: NSObject, Mappable { var url: String? var name: String? var color: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) url <- map["url"] name <- map["name"] color <- map["color"] } } ================================================ FILE: BeeFun/BeeFun/Model/Issue/ObjMilestone.swift ================================================ // // ObjMilestone.swift // BeeFun // // Created by WengHengcong on 2/23/16. // Copyright © 2016 JungleSong. All rights reserved. // /* { "url": "https://api.github.com/repos/octocat/Hello-World/milestones/1", "html_url": "https://github.com/octocat/Hello-World/milestones/v1.0", "labels_url": "https://api.github.com/repos/octocat/Hello-World/milestones/1/labels", "id": 1002604, "number": 1, "state": "open", "title": "v1.0", "description": "Tracking milestone for version 1.0", "creator": { "login": "octocat", "id": 1, "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false }, "open_issues": 4, "closed_issues": 8, "created_at": "2011-04-10T20:09:31Z", "updated_at": "2014-03-03T18:58:10Z", "closed_at": "2013-02-12T13:22:01Z", "due_on": "2012-10-09T23:39:01Z" } */ import UIKit import ObjectMapper class ObjMilestone: NSObject, Mappable { var url: String? var html_url: String? var labels_url: String? var id: Int? var number: Int? var state: String? var title: String? var cdescription: String? //与description关键字冲突 var creator: ObjUser? var open_issues: Int? var closed_issues: Int? var created_at: String? var updated_at: String? var closed_at: String? var due_on: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) url <- map["url"] html_url <- map["html_url"] labels_url <- map["labels_url"] id <- map["id"] number <- map["number"] state <- map["state"] title <- map["title"] cdescription <- map["description"] creator <- map["creator"] open_issues <- map["open_issues"] closed_issues <- map["closed_issues"] created_at <- map["created_at"] updated_at <- map["updated_at"] closed_at <- map["closed_at"] due_on <- map["due_on"] } } ================================================ FILE: BeeFun/BeeFun/Model/Network/AppToken.swift ================================================ // // ObjUser.swift // BeeFun // // Created by wenghengcong on 16/1/12. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class AppToken: NSObject { enum DefaultsKeys: String { case tokenKey = "TokenKey" case tokenType = "TokenType" case tokenScope = "TokenScope" case tokenExpire = "TokenExpiry" case tokenExpireDate = "tokenExpireDate" } let defaults: UserDefaults static let shared = AppToken() init(defaults: UserDefaults) { self.defaults = defaults } override init() { self.defaults = UserDefaults.standard } var access_token: String? { get { let key = defaults.string(forKey: DefaultsKeys.tokenKey.rawValue) return key } set(newToken) { defaults.set(newToken, forKey: DefaultsKeys.tokenKey.rawValue) } } var token_type: String? { get { let key = defaults.string(forKey: DefaultsKeys.tokenType.rawValue) return key } set(newType) { defaults.set(newType, forKey: DefaultsKeys.tokenType.rawValue) } } var scope: String? { get { let key = defaults.string(forKey: DefaultsKeys.tokenScope.rawValue) return key } set(newScope) { defaults.set(newScope, forKey: DefaultsKeys.tokenScope.rawValue) } } var isValid: Bool { if let token = access_token { return token.isEmpty } return false } var token_expire_date: Date? { get { let date = defaults.object(forKey: DefaultsKeys.tokenExpireDate.rawValue) as? Date return date } set(newDate) { defaults.set(newDate, forKey: DefaultsKeys.tokenExpireDate.rawValue) } } func clear() { access_token = nil token_type = nil scope = nil token_expire_date = Date() } } ================================================ FILE: BeeFun/BeeFun/Model/Network/NetFilter.swift ================================================ // // NetFilter.swift // BeeFun // // Created by Hunt on 2019/6/25. // Copyright © 2019 JungleSong. All rights reserved. // import UIKit class NetFilter: Codable { /// Filter名称 var name: String? /// 排序字段 var sidx: String? /// 升降序,desc/asc var sord: String? /// 页码 var page: UInt? /// 每页大小 var pageSize: UInt? } class TagFilter: NetFilter { var owner: String? = UserManager.shared.login var tag: String? enum TagFilterCodingKeys: String, CodingKey { case owner case tag } required override init() { super.init() } //编码方法 override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: TagFilterCodingKeys.self) try container.encode(owner, forKey: TagFilterCodingKeys.owner) try container.encode(tag, forKey: TagFilterCodingKeys.tag) try super.encode(to: encoder) } //解码方法 required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: TagFilterCodingKeys.self) self.owner = try container.decode(String.self, forKey: .owner) self.tag = try container.decode(String.self, forKey: .tag) try super.init(from: decoder) } } ================================================ FILE: BeeFun/BeeFun/Model/Network/ObjErropReponse.swift ================================================ // // ObjErropReponse.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "message": "Validation Failed", "errors": [ { "resource": "Search", "field": "q", "code": "missing" } ], "documentation_url": "https://developer.github.com/v3/search" } */ class ObjErropReponse: NSObject, Mappable { var message: String? var errors: [ObjError]? var documentationUrl: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) message <- map["message"] errors <- map["errors"] documentationUrl <- map["documentation_url"] } } ================================================ FILE: BeeFun/BeeFun/Model/Network/ObjError.swift ================================================ // // ObjErrorMessage.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "resource": "Search", "field": "q", "code": "missing" } */ class ObjError: NSObject, Mappable { var resource: String? var field: String? var code: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) resource <- map["resource"] field <- map["field"] code <- map["code"] } } ================================================ FILE: BeeFun/BeeFun/Model/Network/ObjResponseHeader.swift ================================================ // // ObjResponseHeader.swift // BeeFun // // Created by wenghengcong on 16/1/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* "Access-Control-Allow-Credentials" = true; "Access-Control-Allow-Origin" = "*"; "Access-Control-Expose-Headers" = "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"; "Cache-Control" = "private, max-age=60, s-maxage=60"; "Content-Encoding" = gzip; "Content-Security-Policy" = "default-src 'none'"; "Content-Type" = "application/json; charset=utf-8"; Date = "Sun, 31 Jan 2016 09:06:03 GMT"; Etag = "W/\"b2c5f6199e027d93fa523f36a97ad058\""; Link = "; rel=\"next\", ; rel=\"last\""; Server = "GitHub.com"; Status = "200 OK"; "Strict-Transport-Security" = "max-age=31536000; includeSubdomains; preload"; "Transfer-Encoding" = Identity; Vary = "Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding"; "X-Accepted-OAuth-Scopes" = ""; "X-Content-Type-Options" = nosniff; "X-Frame-Options" = deny; "X-GitHub-Media-Type" = "github.v3"; "X-GitHub-Request-Id" = "74FBD5F3:1C1EA:104F1885:56ADCE78"; "X-OAuth-Client-Id" = 294e97e63b0e68f456ad; "X-OAuth-Scopes" = "public_repo, user"; "X-RateLimit-Limit" = 5000; "X-RateLimit-Remaining" = 4993; "X-RateLimit-Reset" = 1454234562; "X-Served-By" = 4c8b2d4732c413f4b9aefe394bd65569; "X-XSS-Protection" = "1; mode=block"; */ class ObjResponseHeader: NSObject, Mappable { var AccessControlAllowCredentials: String? var AccessControlAllowOrigin: String? var AccessControlExposeHeaders: String? var CacheControl: String? var ContentEncoding: String? var ContentSecurityPolicy: String? var ContentType: String? var Date: String? var Etag: String? var Link: String? var Server: String? var Status: String? var StrictTransportSecurity: String? var TransferEncoding: String? var Vary: String? var XAcceptedOAuthScopes: String? var XContentTypeOptions: String? var XFrameOptions: String? var XGitHubMediaType: String? var XGitHubRequestId: String? var XOAuthClientId: String? var XOAuthScopes: String? var XRateLimitLimit: Int? var XRateLimitRemaining: Int? var XRateLimitReset: Int? var XServedBy: String? var XXSSProtection: String? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) AccessControlAllowCredentials <- map["Access-Control-Allow-Credentials"] AccessControlAllowOrigin <- map["Access-Control-Allow-Origin"] AccessControlExposeHeaders <- map["Access-Control-Expose-Headers"] CacheControl <- map["Cache-Control"] ContentEncoding <- map["Content-Encoding"] ContentSecurityPolicy <- map["Content-Security-Policy"] ContentType <- map["Content-Type"] Date <- map["Date"] Etag <- map["Etag"] Link <- map["Link"] Server <- map["Server"] Status <- map["Status"] StrictTransportSecurity <- map["Strict-Transport-Security"] TransferEncoding <- map["Transfer-Encoding"] Vary <- map["Vary"] XAcceptedOAuthScopes <- map["X-Accepted-OAuth-Scopes"] XContentTypeOptions <- map["X-Content-Type-Options"] XFrameOptions <- map["X-Frame-Options"] XGitHubMediaType <- map["X-GitHub-Media-Type"] XGitHubRequestId <- map["X-GitHub-Request-Id"] XOAuthClientId <- map["X-OAuth-Client-Id"] XOAuthScopes <- map["X-OAuth-Scopes"] XRateLimitLimit <- map["X-RateLimit-Limit"] XRateLimitRemaining <- map["X-RateLimit-Remaining"] XRateLimitReset <- map["X-RateLimit-Reset"] XServedBy <- map["X-Served-By"] XXSSProtection <- map["X-XSS-Protection"] } } ================================================ FILE: BeeFun/BeeFun/Model/Network/ObjResponser.swift ================================================ // // ObjResponser.swift // BeeFun // // Created by wenghengcong on 16/1/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* status code: 200, headers { } */ class ObjResponser: NSObject, Mappable { var statusCode: Int? var headers: ObjResponseHeader? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) statusCode <- map["status code"] headers <- map["headers"] } } ================================================ FILE: BeeFun/BeeFun/Model/ObjBase.swift ================================================ // // ObjBase.swift // BeeFun // // Created by wenghengcong on 16/1/7. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class ObjBase: Mappable { // var guid // var obj_type // var create_at // var update_at // required init?(map: Map) { } func mapping(map: Map) { } } ================================================ FILE: BeeFun/BeeFun/Model/Other/ObjSettings.swift ================================================ // // ObjSettings.swift // BeeFun // // Created by wenghengcong on 16/1/19. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class ObjSettings: NSObject { var itemKey: String? var itemName: String? var itemValue: String? var itemIcon: String? var itemDisclosure: Bool? override func setValue(_ value: Any?, forUndefinedKey key: String) { return } override func setValuesForKeys(_ keyedValues: [String : Any]) { itemKey = keyedValues["itemKey"] as? String itemName = keyedValues["itemName"] as? String itemValue = keyedValues["itemValue"] as? String itemIcon = keyedValues["itemIcon"] as? String itemDisclosure = keyedValues["itemDisclosure"] as? Bool } } ================================================ FILE: BeeFun/BeeFun/Model/Repos/ObjGithubStarRepos.swift ================================================ // // ObjStarRepos.swift // BeeFunMac // // Created by WengHengcong on 2017/12/27. // Copyright © 2017年 LuCi. All rights reserved. // import Foundation import ObjectMapper /// Star repos可以在请求头添加accept字段,获取到star的时间 /// https://developer.github.com/v3/activity/starring/ class ObjGithubStarRepos: NSObject, Mappable { var starred_at: String? var repo: ObjRepos? required init?(map: Map) { } func mapping(map: Map) { starred_at <- map["starred_at"] repo <- map["repo"] repo?.starred_at = starred_at } } ================================================ FILE: BeeFun/BeeFun/Model/Repos/ObjRepos.swift ================================================ // // ObjRepos.swift // BeeFun // // Created by wenghengcong on 16/1/23. // Copyright © 2016年 JungleSong. All rights reserved. // import Foundation import ObjectMapper /* { "id": 3739481, "name": "ZXingObjC", "full_name": "TheLevelUp/ZXingObjC", "owner": { "login": "TheLevelUp", "id": 1521628, "avatar_url": "https://avatars3.githubusercontent.com/u/1521628?v=4", "gravatar_id": "", "url": "https://api.github.com/users/TheLevelUp", "html_url": "https://github.com/TheLevelUp", "followers_url": "https://api.github.com/users/TheLevelUp/followers", "following_url": "https://api.github.com/users/TheLevelUp/following{/other_user}", "gists_url": "https://api.github.com/users/TheLevelUp/gists{/gist_id}", "starred_url": "https://api.github.com/users/TheLevelUp/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/TheLevelUp/subscriptions", "organizations_url": "https://api.github.com/users/TheLevelUp/orgs", "repos_url": "https://api.github.com/users/TheLevelUp/repos", "events_url": "https://api.github.com/users/TheLevelUp/events{/privacy}", "received_events_url": "https://api.github.com/users/TheLevelUp/received_events", "type": "Organization", "site_admin": false }, "private": false, "html_url": "https://github.com/TheLevelUp/ZXingObjC", "description": "An Objective-C Port of ZXing", "fork": false, "url": "https://api.github.com/repos/TheLevelUp/ZXingObjC", "forks_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/forks", "keys_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/teams", "hooks_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/hooks", "issue_events_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues/events{/number}", "events_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/events", "assignees_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/assignees{/user}", "branches_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/branches{/branch}", "tags_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/tags", "blobs_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/refs{/sha}", "trees_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/statuses/{sha}", "languages_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/languages", "stargazers_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/stargazers", "contributors_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/contributors", "subscribers_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/subscribers", "subscription_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/subscription", "commits_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/commits{/sha}", "git_commits_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/git/commits{/sha}", "comments_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/comments{/number}", "issue_comment_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues/comments{/number}", "contents_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/contents/{+path}", "compare_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/merges", "archive_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/downloads", "issues_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/issues{/number}", "pulls_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/pulls{/number}", "milestones_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/milestones{/number}", "notifications_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/labels{/name}", "releases_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/releases{/id}", "deployments_url": "https://api.github.com/repos/TheLevelUp/ZXingObjC/deployments", "created_at": "2012-03-16T14:09:18Z", "updated_at": "2018-05-02T02:14:07Z", "pushed_at": "2018-04-18T07:42:30Z", "git_url": "git://github.com/TheLevelUp/ZXingObjC.git", "ssh_url": "git@github.com:TheLevelUp/ZXingObjC.git", "clone_url": "https://github.com/TheLevelUp/ZXingObjC.git", "svn_url": "https://github.com/TheLevelUp/ZXingObjC", "homepage": "", "size": 187508, "stargazers_count": 2644, "watchers_count": 2644, "language": "Objective-C", "has_issues": true, "has_projects": false, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 666, "mirror_url": null, "archived": false, "open_issues_count": 21, "license": { "key": "apache-2.0", "name": "Apache License 2.0", "spdx_id": "Apache-2.0", "url": "https://api.github.com/licenses/apache-2.0" }, "forks": 666, "open_issues": 21, "watchers": 2644, "default_branch": "master", "permissions": { "admin": false, "push": false, "pull": true } } */ public class ObjRepos: NSObject, Mappable { //1 var archive_url: String? var assignees_url: String? var blobs_url: String? var branches_url: String? var clone_url: String? var collaborators_url: String? var comments_url: String? var commits_url: String? var compare_url: String? var contents_url: String? //11 var contributors_url: String? var created_at: String? var default_branch: String? var deployments_url: String? var cdescription: String? //description同关键字冲突,加c前缀 var downloads_url: String? var events_url: String? var fork: Bool? var forks: Int? var forks_count: Int? //21 var forks_url: String? var full_name: String? var git_commits_url: String? var git_refs_url: String? var git_tags_url: String? var git_url: String? var has_downloads: Bool? var has_projects: Bool? var has_issues: Bool? var has_pages: Bool? var has_wiki: Bool? //31 var homepage: String? var hooks_url: String? var html_url: String? var id: Int? var issue_comment_url: String? var issue_events_url: String? var issues_url: String? var keys_url: String? var labels_url: String? var language: String? //41 var languages_url: String? var merges_url: String? var milestones_url: String? var mirror_url: String? var name: String? var notifications_url: String? var open_issues: Int? var open_issues_count: Int? var owner: ObjUser? var star_owner: String? var permissions: ObjPermissions? //51 var cprivate: Bool? //private同关键字冲突,加c前缀 var pulls_url: String? var pushed_at: String? var releases_url: String? var size: Int? var ssh_url: String? var stargazers_count: Int? var stargazers_url: String? var statuses_url: String? var subscribers_url: String? //61 var subscription_url: String? var svn_url: String? var tags_url: String? var teams_url: String? var trees_url: String? var updated_at: String? var url: String? var watchers: Int? var watchers_count: Int? var subscribers_count: Int? //以下字段为单独增加 var star_tags: [String]? var star_lists: [String]? /// 是否订阅该项目 var watched: Bool? = false /// 是否关注该项目 var starred: Bool? = false /// 关注该repo的时间,从网络请求中截取 var starred_at: String? /// Trending中 var trending_star_text: String? /// star var trending_fork_text: String? /// star var trending_star_interval_text: String? /// 200 stars this week var trending_showcase_update_text: String? ///Updated Jul 5, 2017 var score: Double? //搜索得分 struct ReposKey { static let archiveUrlKey = "archive_url" static let assigneesUrlKey = "assignees_url" static let blobsUrlKey = "blobs_url" static let branchesUrlKey = "branches_url" static let cloneUrlKey = "clone_url" static let collaboratorsUrlKey = "collaborators_url" static let commentsUrlKey = "comments_url" static let commitsUrlKey = "commits_url" static let compareUrlKey = "compare_url" static let contentsUrlKey = "contents_url" static let contributorsUrlKey = "contributors_url" static let createdAtKey = "created_at" static let defaultBranchKey = "default_branch" static let deploymentsUrlKey = "deployments_url" static let descriptionKey = "description" static let downloadsUrlKey = "downloads_url" static let eventsUrlKey = "events_url" static let forkKey = "fork" static let forksKey = "forks" static let forksCountKey = "forks_count" static let forksUrlKey = "forks_url" static let fullNameKey = "full_name" static let gitCommitsUrlKey = "git_commits_url" static let gitRefsUrlKey = "git_refs_url" static let gitTagsUrlKey = "git_tags_url" static let gitUrlKey = "git_url" static let hasDownloadsKey = "has_downloads" static let hasProjects = "has_projects" static let hasIssuesKey = "has_issues" static let hasPagesKey = "has_pages" static let hasWikiKey = "has_wiki" static let homepageKey = "homepage" static let hooksUrlKey = "hooks_url" static let htmlUrlKey = "html_url" static let idKey = "id" static let issueCommentUrlKey = "issue_comment_url:" static let issueEventsUrlKey = "issue_events_url" static let issuesUrlKey = "issues_url" static let keysUrlKey = "keys_url" static let labelsUrlKey = "labels_url" static let languageKey = "language" static let languagesUrlKey = "languages_url" static let mergesUrlKey = "merges_url" static let milestonesUrlKey = "milestones_url" static let mirrorUrlKey = "mirror_url" static let nameKey = "name" static let notificationsUrlKey = "notifications_url" static let openIssuesKey = "open_issues" static let openIssuesCountKey = "open_issues_count" static let ownerKey = "owner" static let starOwnerKey = "star_owner" static let permissionsKey = "permissions" static let privateKey = "private" static let pullsUrlKey = "pulls_url" static let pushedAtKey = "pushed_at" static let releasesUrlKey = "releases_url" static let sizeKey = "size" static let sshUrley = "ssh_url" static let stargazersCountKey = "stargazers_count" static let stargazersUrlKey = "stargazers_url" static let statusesUrlKey = "statuses_url" static let subscribersUrlKey = "subscribers_url" static let subscriptionUrlKey = "subscription_url" static let svnUrlKey = "svn_url" static let tagsUrlKey = "tags_url" static let teamsUrlKey = "teams_url" static let treesUrlKey = "trees_url:" static let updatedAtKey = "updated_at" static let urlKey = "url" static let watchersKey = "watchers" static let watchersCountKey = "watchers_count" static let subscribersCountKey = "subscribers_count" static let starTagsKey = "star_tags" static let starListKey = "star_lists" static let watchedKey = "watched" static let scoreKey = "score" static let starred_atKey = "starred_at" static let trending_star_textKey = "trending_star_text" static let trending_fork_textKey = "trending_fork_text" static let trending_star_interval_textKey = "trending_star_interval_text" static let trending_showcase_update_textKey = "trending_showcase_update_text" } // MARK: init and mapping required public init?(map: Map) { } override init() { super.init() } public func mapping(map: Map) { // super.mapping(map) archive_url <- map[ReposKey.archiveUrlKey] assignees_url <- map[ReposKey.assigneesUrlKey] blobs_url <- map[ReposKey.blobsUrlKey] branches_url <- map[ReposKey.branchesUrlKey] clone_url <- map[ReposKey.cloneUrlKey] collaborators_url <- map[ReposKey.collaboratorsUrlKey] comments_url <- map[ReposKey.commentsUrlKey] commits_url <- map[ReposKey.commitsUrlKey] compare_url <- map[ReposKey.compareUrlKey] contents_url <- map[ReposKey.contentsUrlKey] contributors_url <- map[ReposKey.contributorsUrlKey] created_at <- map[ReposKey.createdAtKey] default_branch <- map[ReposKey.defaultBranchKey] deployments_url <- map[ReposKey.deploymentsUrlKey] cdescription <- map[ReposKey.descriptionKey] downloads_url <- map[ReposKey.downloadsUrlKey] events_url <- map[ReposKey.eventsUrlKey] fork <- map[ReposKey.forkKey] forks <- map[ReposKey.forksKey] forks_count <- map[ReposKey.forksCountKey] forks_url <- map[ReposKey.forksUrlKey] full_name <- map[ReposKey.fullNameKey] git_commits_url <- map[ReposKey.gitCommitsUrlKey] git_refs_url <- map[ReposKey.gitRefsUrlKey] git_tags_url <- map[ReposKey.gitTagsUrlKey] git_url <- map[ReposKey.gitUrlKey] has_downloads <- map[ReposKey.hasDownloadsKey] has_projects <- map[ReposKey.hasProjects] has_issues <- map[ReposKey.hasIssuesKey] has_pages <- map[ReposKey.hasPagesKey] has_wiki <- map[ReposKey.hasWikiKey] homepage <- map[ReposKey.homepageKey] hooks_url <- map[ReposKey.hooksUrlKey] html_url <- map[ReposKey.htmlUrlKey] id <- map[ReposKey.idKey] issue_comment_url <- map[ReposKey.issueCommentUrlKey] issue_events_url <- map[ReposKey.issueEventsUrlKey] issues_url <- map[ReposKey.issuesUrlKey] keys_url <- map[ReposKey.keysUrlKey] labels_url <- map[ReposKey.labelsUrlKey] language <- map[ReposKey.languageKey] languages_url <- map[ReposKey.languagesUrlKey] merges_url <- map[ReposKey.mergesUrlKey] milestones_url <- map[ReposKey.milestonesUrlKey] mirror_url <- map[ReposKey.mirrorUrlKey] name <- map[ReposKey.nameKey] notifications_url <- map[ReposKey.notificationsUrlKey] open_issues <- map[ReposKey.openIssuesKey] open_issues_count <- map[ReposKey.openIssuesCountKey] owner <- map[ReposKey.ownerKey] star_owner <- map[ReposKey.starOwnerKey] permissions <- map[ReposKey.permissionsKey] cprivate <- map[ReposKey.privateKey] pulls_url <- map[ReposKey.pullsUrlKey] pushed_at <- map[ReposKey.pushedAtKey] releases_url <- map[ReposKey.releasesUrlKey] size <- map[ReposKey.sizeKey] ssh_url <- map[ReposKey.sshUrley] stargazers_count <- map[ReposKey.stargazersCountKey] stargazers_url <- map[ReposKey.stargazersUrlKey] statuses_url <- map[ReposKey.statusesUrlKey] subscribers_url <- map[ReposKey.subscribersUrlKey] subscription_url <- map[ReposKey.subscriptionUrlKey] svn_url <- map[ReposKey.svnUrlKey] tags_url <- map[ReposKey.gitTagsUrlKey] teams_url <- map[ReposKey.teamsUrlKey] trees_url <- map[ReposKey.treesUrlKey] updated_at <- map[ReposKey.updatedAtKey] url <- map[ReposKey.urlKey] watchers <- map[ReposKey.watchersKey] watchers_count <- map[ReposKey.watchersCountKey] subscribers_count <- map[ReposKey.subscribersCountKey] score <- map[ReposKey.scoreKey] starred_at <- map[ReposKey.starred_atKey] star_tags <- map[ReposKey.starTagsKey] star_lists <- map[ReposKey.starListKey] trending_fork_text <- map[ReposKey.trending_fork_textKey] trending_star_text <- map[ReposKey.trending_star_textKey] trending_star_interval_text <- map[ReposKey.trending_star_interval_textKey] trending_showcase_update_text <- map[ReposKey.trending_showcase_update_textKey] } } ================================================ FILE: BeeFun/BeeFun/Model/Repos/ObjReposSum.swift ================================================ // // ObjReposSum.swift // BeeFun // // Created by WengHengcong on 16/1/26. // Copyright © 2016年 JungleSong. All rights reserved. // import ObjectMapper /* "id": 1296269, "owner": { "login": "octocat", "id": 1, "avatar_url": "https://github.com/images/error/octocat_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octocat", "html_url": "https://github.com/octocat", "followers_url": "https://api.github.com/users/octocat/followers", "following_url": "https://api.github.com/users/octocat/following{/other_user}", "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", "organizations_url": "https://api.github.com/users/octocat/orgs", "repos_url": "https://api.github.com/users/octocat/repos", "events_url": "https://api.github.com/users/octocat/events{/privacy}", "received_events_url": "https://api.github.com/users/octocat/received_events", "type": "User", "site_admin": false }, "name": "Hello-World", "full_name": "octocat/Hello-World", "description": "This your first repo!", "private": false, "fork": false, "url": "https://api.github.com/repos/octocat/Hello-World", "html_url": "https://github.com/octocat/Hello-World" */ class ObjReposSum: NSObject { } ================================================ FILE: BeeFun/BeeFun/Model/Trending/ObjShowcase.swift ================================================ // // ObjShowcase.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* "name": "Policies", "slug": "policies", "description": "From federal governments to corporations to student clubs, groups of all sizes are using GitHub to share, discuss, and improve laws. Ask...", "image_url": "http://trending.codehub-app.com/policies.png", "repositories": [ObjRespo] */ class ObjShowcase: NSObject, Mappable { var name: String? var slug: String? var cdescription: String? var image_url: String? var repositories: [ObjRepos]? //自定义字段,从网页解析 /// 项目数目 var trend_repo_text: String? /// 语言数目 var trend_lan_text: String? /// 解析后的图片svg数据,base64未解码数据 var svgXml: String? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) name <- map["name"] slug <- map["slug"] cdescription <- map["description"] image_url <- map["image_url"] repositories <- map["repositories"] //自定义字段 //repos_count\launguage_count } } ================================================ FILE: BeeFun/BeeFun/Model/User/ObjEmail.swift ================================================ // // ObjEmail.swift // BeeFun // // Created by WengHengcong on 16/1/25. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class ObjEmail: NSObject, Mappable { var email: String? var primary: Bool? var verified: Bool? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) email <- map["email"] primary <- map["primary"] verified <- map["verified"] } } ================================================ FILE: BeeFun/BeeFun/Model/User/ObjPermissions.swift ================================================ // // ObjPermissions.swift // BeeFun // // Created by wenghengcong on 16/1/23. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class ObjPermissions: NSObject, Mappable { var admin: Int? var pull: Int? var push: Int? required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) admin <- map["admin"] pull <- map["pull"] push <- map["push"] } } ================================================ FILE: BeeFun/BeeFun/Model/User/ObjPlan.swift ================================================ // // ObjPlan.swift // BeeFun // // Created by wenghengcong on 16/1/14. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* "private_repos" : 0, "collaborators" : 0, "space" : 976562499, "name" : "free" */ class ObjPlan: NSObject, NSCoding, Mappable { var private_repos: Int? var collaborators: Int? var space: Int? var name: String? struct PlanKey { static let privateReposKey = "private_repos" static let collaboratorsKey = "collaborators" static let spaceKey = "space" static let nameKey = "name" } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) private_repos <- map[PlanKey.privateReposKey] collaborators <- map[PlanKey.collaboratorsKey] space <- map[PlanKey.spaceKey] name <- map[PlanKey.nameKey] } func encode(with aCoder: NSCoder) { aCoder.encode(private_repos, forKey:PlanKey.privateReposKey) aCoder.encode(collaborators, forKey:PlanKey.collaboratorsKey) aCoder.encode(space, forKey:PlanKey.spaceKey) aCoder.encode(name, forKey:PlanKey.nameKey) } required init?(coder aDecoder: NSCoder) { super.init() private_repos = aDecoder.decodeObject(forKey: PlanKey.privateReposKey) as? Int collaborators = aDecoder.decodeObject(forKey: PlanKey.collaboratorsKey) as? Int space = aDecoder.decodeObject(forKey: PlanKey.spaceKey) as? Int name = aDecoder.decodeObject(forKey: PlanKey.nameKey) as? String } } ================================================ FILE: BeeFun/BeeFun/Model/User/ObjUser.swift ================================================ // // ObjUser.swift // BeeFun // // Created by wenghengcong on 16/1/14. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "avatar_url": "https://avatars3.githubusercontent.com/u/3964406?v=4", "bio": "iOS Developer/App addict", "blog": "http://www.wenghengcong.com", "collaborators": 0, "company": "JD ", "created_at": "2013-03-25T13:03:12Z", "disk_usage": 1557766, "email": "wenghengcong@gmail.com", "events_url": "https://api.github.com/users/wenghengcong/events{/privacy}", "followers": 56, "followers_url": "https://api.github.com/users/wenghengcong/followers", "following": 38, "following_url": "https://api.github.com/users/wenghengcong/following{/other_user}", "gists_url": "https://api.github.com/users/wenghengcong/gists{/gist_id}", "gravatar_id": "", "hireable": true, "html_url": "https://github.com/wenghengcong", "id": 3964406, "location": "ShangHai", "login": "wenghengcong", "name": "wenghengcong", "node_id": "MDQ6VXNlcjM5NjQ0MDY=", "organizations_url": "https://api.github.com/users/wenghengcong/orgs", "owned_private_repos": 20, "plan": { "collaborators": 0, "name": "developer", "private_repos": 9999, "space": 976562499 }, "private_gists": 0, "public_gists": 2, "public_repos": 12, "received_events_url": "https://api.github.com/users/wenghengcong/received_events", "repos_url": "https://api.github.com/users/wenghengcong/repos", "site_admin": false, "starred_url": "https://api.github.com/users/wenghengcong/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/wenghengcong/subscriptions", "total_private_repos": 20, "two_factor_authentication": false, "type": "User", "updated_at": "2018-06-11T15:32:59Z", "url": "https://api.github.com/users/wenghengcong" } */ public class ObjUser: NSObject, NSCoding, Mappable { // MARK: repos var total_private_repos: Int? var public_repos: Int? var owned_private_repos: Int? var repos_url: String? // MARK: follower var followers: Int? var following: Int? var following_url: String? var followers_url: String? // MARK: user infomation var name: String? var bio: String? var organizations_url: String? var location: String? var blog: String? var avatar_url: String? var email: String? var company: String? var hireable: Bool? var login: String? //wenghengcong // MARK: gist var private_gists: Int? var public_gists: Int? var gists_url: String? // MARK: github information var type: String? var starred_url: String? var id: Int? var collaborators: Int? var gravatar_id: String? var disk_usage: Int? var url: String? var updated_at: String? var created_at: String? var site_admin: Bool? var received_events_url: String? var subscriptions_url: String? var events_url: String? var html_url: String? var plan: ObjPlan? var node_id: String? var two_factor_authentication: Bool? // MARK: 自定义字段 var trend_repo_order: Int? //排序order var trend_user_name: String? //developer的名称 var trend_repo_name: String? //repo的名称 var trend_repo_desc: String? //repo的描述 var trend_user_follow: String? //关注的文本,Follow/UnFollow var score: Double? //搜索得分 var display_login: String? //pull request event中actor需要的属性 var token: String? struct UserKey { static let totalPrivateReposKey = "total_private_repos" static let publicReposKey = "public_repos" static let ownedPrivateReposKey = "owned_private_repos" static let reposUrlKey = "repos_url" static let followersKey = "followers" static let followingKey = "following" static let followingUrlKey = "following_url" static let followersUrlKey = "followers_url" static let nameKey = "name" static let bioKey = "bio" static let organizationsUrlKey = "organizations_url" static let locationKey = "location" static let blogKey = "blog" static let avatarUrlKey = "avatar_url" static let emailKey = "email" static let companyKey = "company" static let hireableKey = "hireable" static let loginKey = "login" static let privateGistsKey = "private_gists" static let publicGistsKey = "public_gists" static let gistsUrlKey = "gists_url" static let typeKey = "type" static let starredUrlKey = "starred_url" static let idKey = "id" static let collaboratorsKey = "collaborators" static let gravatarIdKey = "gravatar_id" static let diskUsageKey = "disk_usage" static let urlKey = "url" static let updatedAtKey = "updated_at" static let createdAtKey = "created_at" static let siteAdminKey = "site_admin" static let receivedRventsUrlKey = "received_events_url" static let subscriptionsUrlKey = "subscriptions_url" static let eventsUrlKey = "events_url" static let htmlUrlKey = "html_url" static let planKey = "plan" static let trend_repo_order = "trend_repo_order" static let trend_repo_name = "trend_repo_name" static let trend_repo_desc = "trend_repo_desc" static let score = "score" static let display_login = "display_login" static let node_id = "node_id" static let two_factor_authentication = "two_factor_authentication" static let token = "token" } // MARK: init and mapping required public init?(map: Map) { } override init() { super.init() } public func mapping(map: Map) { // super.mapping(map) total_private_repos <- map[UserKey.totalPrivateReposKey] public_repos <- map[UserKey.publicReposKey] owned_private_repos <- map[UserKey.ownedPrivateReposKey] repos_url <- map[UserKey.reposUrlKey] followers <- map[UserKey.followersKey] following <- map[UserKey.followingKey] following_url <- map[UserKey.followingUrlKey] followers_url <- map[UserKey.followersUrlKey] name <- map[UserKey.nameKey] bio <- map[UserKey.bioKey] organizations_url <- map[UserKey.organizationsUrlKey] location <- map[UserKey.locationKey] blog <- map[UserKey.blogKey] avatar_url <- map[UserKey.avatarUrlKey] email <- map[UserKey.emailKey] company <- map[UserKey.companyKey] hireable <- map[UserKey.hireableKey] login <- map[UserKey.loginKey] private_gists <- map[UserKey.privateGistsKey] public_gists <- map[UserKey.publicGistsKey] gists_url <- map[UserKey.gistsUrlKey] type <- map[UserKey.typeKey] starred_url <- map[UserKey.starredUrlKey] id <- map[UserKey.idKey] collaborators <- map[UserKey.collaboratorsKey] gravatar_id <- map[UserKey.gravatarIdKey] disk_usage <- map[UserKey.diskUsageKey] url <- map[UserKey.urlKey] updated_at <- map[UserKey.updatedAtKey] created_at <- map[UserKey.createdAtKey] site_admin <- map[UserKey.siteAdminKey] received_events_url <- map[UserKey.receivedRventsUrlKey] subscriptions_url <- map[UserKey.subscriptionsUrlKey] events_url <- map[UserKey.eventsUrlKey] html_url <- map[UserKey.htmlUrlKey] plan <- map[UserKey.planKey] //自定义时,trend相关字段无须存储 //trend_repo_desc score <- map[UserKey.score] display_login <- map[UserKey.display_login] node_id <- map[UserKey.node_id] two_factor_authentication <- map[UserKey.two_factor_authentication] token <- map[UserKey.token]; } public func encode(with aCoder: NSCoder) { aCoder.encode(total_private_repos, forKey: UserKey.totalPrivateReposKey) aCoder.encode(public_repos, forKey: UserKey.publicReposKey) aCoder.encode(owned_private_repos, forKey: UserKey.ownedPrivateReposKey) aCoder.encode(repos_url, forKey: UserKey.reposUrlKey) aCoder.encode(followers, forKey: UserKey.followersKey) aCoder.encode(following, forKey: UserKey.followingKey) aCoder.encode(following_url, forKey: UserKey.followingUrlKey) aCoder.encode(followers_url, forKey: UserKey.followersUrlKey) aCoder.encode(name, forKey: UserKey.nameKey) aCoder.encode(bio, forKey: UserKey.bioKey) aCoder.encode(organizations_url, forKey: UserKey.organizationsUrlKey) aCoder.encode(location, forKey: UserKey.locationKey) aCoder.encode(blog, forKey: UserKey.blogKey) aCoder.encode(avatar_url, forKey: UserKey.avatarUrlKey) aCoder.encode(email, forKey: UserKey.emailKey) aCoder.encode(company, forKey: UserKey.companyKey) aCoder.encode(hireable, forKey: UserKey.hireableKey) aCoder.encode(login, forKey: UserKey.loginKey) aCoder.encode(private_gists, forKey: UserKey.privateGistsKey) aCoder.encode(public_gists, forKey: UserKey.publicGistsKey) aCoder.encode(gists_url, forKey: UserKey.gistsUrlKey) aCoder.encode(type, forKey: UserKey.typeKey) aCoder.encode(starred_url, forKey: UserKey.starredUrlKey) aCoder.encode(id, forKey: UserKey.idKey) aCoder.encode(collaborators, forKey: UserKey.collaboratorsKey) aCoder.encode(gravatar_id, forKey: UserKey.gravatarIdKey) aCoder.encode(disk_usage, forKey: UserKey.diskUsageKey) aCoder.encode(url, forKey: UserKey.urlKey) aCoder.encode(updated_at, forKey: UserKey.updatedAtKey) aCoder.encode(created_at, forKey: UserKey.createdAtKey) aCoder.encode(site_admin, forKey: UserKey.siteAdminKey) aCoder.encode(received_events_url, forKey: UserKey.receivedRventsUrlKey) aCoder.encode(subscriptions_url, forKey: UserKey.subscriptionsUrlKey) aCoder.encode(events_url, forKey: UserKey.eventsUrlKey) aCoder.encode(html_url, forKey: UserKey.htmlUrlKey) aCoder.encode(plan, forKey: UserKey.planKey) aCoder.encode(score, forKey: UserKey.score) aCoder.encode(display_login, forKey: UserKey.display_login) aCoder.encode(node_id, forKey: UserKey.node_id) aCoder.encode(two_factor_authentication, forKey: UserKey.two_factor_authentication) aCoder.encode(token, forKey: UserKey.token) //自定义时,trend相关字段无须存储 } //The required keyword means this initializer must be implemented on every subclass of the class that defines this initializer. //The convenience keyword denotes this initializer as a convenience initializer. Convenience initializers are secondary, supporting initializers that need to call one of their class’s designated initializers. Designated initializers are the primary initializers for a class. They fully initialize all properties introduced by that class and call a superclass initializer to continue the initialization process up the superclass chain. Here, you’re declaring this initializer as a convenience initializer because it only applies when there’s saved data to be loaded. required public init?(coder aDecoder: NSCoder) { super.init() total_private_repos = aDecoder.decodeObject(forKey: UserKey.totalPrivateReposKey) as? Int public_repos = aDecoder.decodeObject(forKey: UserKey.publicReposKey) as? Int owned_private_repos = aDecoder.decodeObject(forKey: UserKey.ownedPrivateReposKey) as? Int repos_url = aDecoder.decodeObject(forKey: UserKey.reposUrlKey) as? String followers = aDecoder.decodeObject(forKey: UserKey.followersKey) as? Int following = aDecoder.decodeObject(forKey: UserKey.followingKey) as? Int following_url = aDecoder.decodeObject(forKey: UserKey.followingUrlKey) as? String followers_url = aDecoder.decodeObject(forKey: UserKey.followersUrlKey) as? String name = aDecoder.decodeObject(forKey: UserKey.nameKey) as? String bio = aDecoder.decodeObject(forKey: UserKey.bioKey) as? String organizations_url = aDecoder.decodeObject(forKey: UserKey.organizationsUrlKey) as? String location = aDecoder.decodeObject(forKey: UserKey.locationKey) as? String blog = aDecoder.decodeObject(forKey: UserKey.blogKey) as? String avatar_url = aDecoder.decodeObject(forKey: UserKey.avatarUrlKey) as? String email = aDecoder.decodeObject(forKey: UserKey.emailKey) as? String company = aDecoder.decodeObject(forKey: UserKey.companyKey) as? String hireable = aDecoder.decodeObject(forKey: UserKey.hireableKey) as? Bool login = aDecoder.decodeObject(forKey: UserKey.loginKey) as? String private_gists = aDecoder.decodeObject(forKey: UserKey.privateGistsKey) as? Int public_gists = aDecoder.decodeObject(forKey: UserKey.publicGistsKey) as? Int gists_url = aDecoder.decodeObject(forKey: UserKey.gistsUrlKey) as? String type = aDecoder.decodeObject(forKey: UserKey.typeKey) as? String starred_url = aDecoder.decodeObject(forKey: UserKey.starredUrlKey) as? String id = aDecoder.decodeObject(forKey: UserKey.idKey) as? Int collaborators = aDecoder.decodeObject(forKey: UserKey.collaboratorsKey) as? Int gravatar_id = aDecoder.decodeObject(forKey: UserKey.gravatarIdKey) as? String disk_usage = aDecoder.decodeObject(forKey: UserKey.diskUsageKey) as? Int url = aDecoder.decodeObject(forKey: UserKey.urlKey) as? String updated_at = aDecoder.decodeObject(forKey: UserKey.updatedAtKey) as? String created_at = aDecoder.decodeObject(forKey: UserKey.createdAtKey) as? String site_admin = aDecoder.decodeObject(forKey: UserKey.siteAdminKey) as? Bool received_events_url = aDecoder.decodeObject(forKey: UserKey.receivedRventsUrlKey) as? String subscriptions_url = aDecoder.decodeObject(forKey: UserKey.subscriptionsUrlKey) as? String events_url = aDecoder.decodeObject(forKey: UserKey.eventsUrlKey) as? String html_url = aDecoder.decodeObject(forKey: UserKey.htmlUrlKey) as? String plan = aDecoder.decodeObject(forKey: UserKey.planKey) as? ObjPlan score = aDecoder.decodeObject(forKey: UserKey.score) as? Double display_login = aDecoder.decodeObject(forKey: UserKey.display_login) as? String node_id = aDecoder.decodeObject(forKey: UserKey.node_id) as? String two_factor_authentication = aDecoder.decodeObject(forKey: UserKey.two_factor_authentication) as? Bool token = aDecoder.decodeObject(forKey: UserKey.token) as? String //自定义时,trend相关字段无须存储 } // MARK: Archive path static let documentDirectory = JSFileManager.documentsUrl static let archiveURL = documentDirectory.appendingPathComponent("userinfo") // MARK: save and load user info with disk class func saveUserInfo(_ user: ObjUser?) { if user == nil { print("user is nil...") } else { // NSKeyedArchiver.setClassName("ObjUser", for: ObjUser.self) let isScuessfulSave = NSKeyedArchiver.archiveRootObject(user!, toFile: ObjUser.archiveURL.path) if !isScuessfulSave { print("Failed to save user ...") } } } class func loadUserInfo() -> ObjUser? { // NSKeyedUnarchiver.setClass(ObjUser.self, forClassName: "ObjUser") return NSKeyedUnarchiver.unarchiveObject(withFile: ObjUser.archiveURL.path) as? ObjUser } class func deleteUserInfo() { let fileM = FileManager.default if fileM.fileExists(atPath: archiveURL.path) { do { try fileM.removeItem(at: archiveURL) } catch { } } } } ================================================ FILE: BeeFun/BeeFun/Model/User/ObjUserSum.swift ================================================ // // ObjUserSum.swift // BeeFun // // Created by WengHengcong on 16/1/25. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* "login": "Mike19800206", "id": 13727538, "avatar_url": "https://avatars.githubusercontent.com/u/13727538?v=3", "gravatar_id": "", "url": "https://api.github.com/users/Mike19800206", "html_url": "https://github.com/Mike19800206", "followers_url": "https://api.github.com/users/Mike19800206/followers", "following_url": "https://api.github.com/users/Mike19800206/following{/other_user}", "gists_url": "https://api.github.com/users/Mike19800206/gists{/gist_id}", "starred_url": "https://api.github.com/users/Mike19800206/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Mike19800206/subscriptions", "organizations_url": "https://api.github.com/users/Mike19800206/orgs", "repos_url": "https://api.github.com/users/Mike19800206/repos", "events_url": "https://api.github.com/users/Mike19800206/events{/privacy}", "received_events_url": "https://api.github.com/users/Mike19800206/received_events", "type": "User", "site_admin": false */ class ObjUserSum: NSObject, Mappable { var login: String? //wenghengcong var id: Int? var avatar_url: String? var url: String? var html_url: String? var following_url: String? var followers_url: String? var gists_url: String? var starred_url: String? var subscriptions_url: String? var organizations_url: String? var repos_url: String? var events_url: String? var received_events_url: String? var type: String? var site_admin: Bool? struct UserSumKey { static let reposUrlKey = "repos_url" static let followingUrlKey = "following_url" static let followersUrlKey = "followers_url" static let organizationsUrlKey = "organizations_url" static let avatarUrlKey = "avatar_url" static let emailKey = "email" static let loginKey = "login" static let gistsUrlKey = "gists_url" static let typeKey = "type" static let starredUrlKey = "starred_url" static let idKey = "id" static let urlKey = "url" static let siteAdminKey = "site_admin" static let receivedRventsUrlKey = "received_events_url" static let subscriptionsUrlKey = "subscriptions_url" static let eventsUrlKey = "events_url" static let htmlUrlKey = "html_url:" } // MARK: init and mapping required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) repos_url <- map[UserSumKey.reposUrlKey] following_url <- map[UserSumKey.followingUrlKey] followers_url <- map[UserSumKey.followersUrlKey] organizations_url <- map[UserSumKey.organizationsUrlKey] avatar_url <- map[UserSumKey.avatarUrlKey] login <- map[UserSumKey.loginKey] gists_url <- map[UserSumKey.gistsUrlKey] type <- map[UserSumKey.typeKey] starred_url <- map[UserSumKey.starredUrlKey] id <- map[UserSumKey.idKey] url <- map[UserSumKey.urlKey] site_admin <- map[UserSumKey.siteAdminKey] received_events_url <- map[UserSumKey.receivedRventsUrlKey] subscriptions_url <- map[UserSumKey.subscriptionsUrlKey] events_url <- map[UserSumKey.eventsUrlKey] html_url <- map[UserSumKey.htmlUrlKey] } } ================================================ FILE: BeeFun/BeeFun/Resources/Localizable/en.lproj/Localizable.strings ================================================ /* Localizable.strings BeeFun Created by WengHengcong on 2017/3/13. Copyright © 2017年 JungleSong. All rights reserved. */ /*****英文转中文 Start******/ //explore "Explore" = "Explore"; "Repositories" = "Repositories"; "Developers" = "Developers"; "Showcases"="Showcases"; //filter "Since"="Since"; "daily"="daily"; "weekly"="weekly"; "monthly"="monthly"; //search "All" = "All"; "Language"="Language"; "Country"="Country"; "Sort"="Sort"; "Reset"="Reset"; "Sure"="Sure"; "Best match"="Best match"; "Most stars"="Most stars"; "Fewest stars"="Fewest stars"; "Most forks"="Most forks"; "Fewest forks"="Fewest forks"; "Recently updated"="Recently updated"; "Leaest recently updated"="Leaest recently updated"; "Search repositories"="Search repositories"; "Search users"="Search users"; "Best match"="Best match"; "Most followers"="Most followers"; "Fewest followers"="Fewest followers"; "Most recently joined"="Most recently joined"; "Leaest recently joined"="Fewest recently joined"; "Most repositories"="Most repositories"; "Fewest repositories"="Fewest repositories"; //Message "Message" = "Message"; "Notifications"="Notifications"; //Stars "Stars" = "Stars"; "Event"="Event"; //Profile "Profile" = "Profile"; "Sign in"="Sign in"; "Followers"="Followers"; "Following"="Following"; "Watched"="Watched"; "Feedback"="Feedback"; "Settings"="Settings"; "Share"="Share"; "Rate"="Rate"; "About"="About"; "Edit"="Edit"; //Settings "Version"="Version"; "Log Out"="Log Out"; //About "About"="About"; "Me"="Me"; //repo view "Watch"="Watch"; "Unwatch"="Unwatch"; "Star"="Star"; "Unstar"="Unstar"; "Fork"="Fork"; "Public"="Public"; "Private"="Private"; "catated at"="catated at"; //user view "Joined on"="Joined on"; "Follow"="Follow"; "Unfollow"="Unfollow"; "Follower"="Follower"; "Repositories"="Repositories"; "Following"="Following"; //长文本 " BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks." = " BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks."; //提醒 "Share Success"="Share Success"; "Share Failure"="Share Failure"; "Share Cancel"="Share Cancel"; "Please login first"="Please login first"; "No Data Found"="No Data Found"; "Release to refresh"="Release to refresh"; "Pull down to refresh"="Pull down to refresh"; "Load"="Load"; "Loading"="Loading"; "More"="More"; "No More data"="😭No More data"; "Network error /(ㄒoㄒ)/~~"="Network error /(ㄒoㄒ)/~~"; "Sign in Now?" = "Sign in Now?"; "access data ask github account"="access data ask github account"; "Watch?"="Watch?"; "Unwatch?"="Unwatch?"; "Unstar?"="Unstar?"; "Star?"="Star?"; "Fork?"="Fork?"; "Watch Success"="Watch Success"; "Unwatch Success"="Unwatch Success"; "Star Success"="Star Success"; "Unstar Success"="Unstar Success"; "Fork Success"="Fork Success"; "Follow Success"="Follow Success"; "UnFollow Success"="UnFollow Success"; "Immediately sync your star repositories from github.com in silence."="Immediately sync your star repositories from github.com in silence."; "Sync"="Sync"; "Sync start"="Sync start"; "Sync end"="Sync end"; //其他 "Unknown" = "Unknown"; "Success"="Success"; "created at"="created at"; "Homepage"="Homepage"; "Cancel"="Cancel"; "Failure"="Failure"; "Repository"="Repository"; "Tags"="Tags"; "All Tags"="All Tags"; "Save"="Save"; "Save Tags?"="Save Tags?"; "Add new tag"="Add new tag"; "input new tag name"="input new tag name"; "input tag"="input tag"; "Already exists!"="Already exists!"; "No tag to save"="No tag to save"; "Demo" = "Demo"; "Edit"="Edit"; "Trash"="Trash"; "OK"="OK"; "make a change"="make a change"; "Lists"="Lists"; //其他 "Owner"="Owner"; "Join"="Join"; "Location"="Location"; "Company"="Company"; "Name"="Name"; "Email"="Email"; "Blog"="Blog"; "Hireable"="Hireable"; "Bio"="Bio"; "Trash it will remove this tag from star repositories!"="Trash it will remove this tag from star repositories!"; //搜索 "Historical records" = "Historical records"; "Clear All Records" = "Clear All Records"; "Search repositories、users..." = "Search repositories、users..."; "Clear all history records?" = "Clear all history records?"; "Forks" = "Forks"; "Updated" = "Updated"; "Users"="Users"; "Search"="Search"; "Joined"="Joined"; "Comments"="Comments"; "Created"="Created"; "Repo"="Repo"; "Foll"="Foll"; "Comm"="Comm"; "Join"="Join"; "Creat"="Creat"; "Delete"="Delete"; "Submit"="Submit"; "Title can't be empty"="Title can't be empty"; "bug? function?..."="bug? function?..."; //分享 "It's A Wonderful Repository from github! Hurry UP!" = "It's A Wonderful Repository from github! Hurry UP!"; "from BeeFun App"="from BeeFun App"; "Download Here"="Download Here"; "A Talented Developer"="A Talented Developer"; "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top" = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top"; "Update Failure" = "Update Failure"; "'All' is default,change one."="'All' is default,change one."; "Try Again"="Try Again"; "Wake up your connection!"="Wake up your connection!"; "Empty now"="Empty now"; "Go"="Go"; "Explore more"="Explore more"; "Empty now,star repositories and tag it"="Empty now,star repositories and tag it"; /*****英文转中文 End******/ /*****中文转英文 Start******/ //explore "发现" = "Explore"; "项目" = "Repositories"; "用户" = "Developers"; "列表"="Showcases"; //filter "时间"="Since"; "每天"="daily"; "每周"="weekly"; "每月"="monthly"; "全部"="All"; //country "中国"="China"; "美国"="USA"; "印度"="India"; "日本"="Japan"; "韩国"="Korea"; "巴西"="Brazil"; "德国"="Germany"; "俄罗斯"="Russia"; "英国"="UK"; "法国"="France"; "西班牙"="Spain"; "加拿大"="Canada"; "新加坡"="Singapore"; "荷兰"="Netherlands"; "意大利"="Italy"; "瑞士"="Switzerland"; "澳大利亚"="Australia"; //City "北京"="Beijing"; "上海"="Shanghai"; "深圳"="Shenzhen"; "杭州"="Hangzhou"; "广州"="Guangzhou"; "成都"="Chengdu"; "南昌"="NanChang"; //search "语言"="Language"; "国家"="Country"; "排序"="Sort"; "重置"="Reset"; "确认"="Sure"; "最优匹配"="Best match"; "收藏最多"="Most stars"; "收藏最少"="Fewest stars"; "派生最多"="Most forks"; "派生最少"="Fewest forks"; "更新最近"="Recently updated"; "更新最少"="Leaest recently updated"; "搜索项目"="Search repositories"; "搜索用户"="Search Users"; "最优匹配"="Best match"; "粉丝最多"="Most followers"; "粉丝最少"="Fewest followers"; "加入最新"="Most recently joined"; "加入最旧"="Fewest recently joined"; "项目最多"="Most repositories"; "项目最少"="Fewest repositories"; //Message "消息" = "Message"; "通知"="Notifications"; "讨论"="Issues"; //Stars "收藏" = "Stars"; "项目"="Repositories"; "事件"="Event"; //Profile "我" = "Profile"; "登录"="Sign in"; "粉丝"="Followers"; "关注"="Following"; "关注"="Watched"; "反馈"="Feedback"; "设置"="Settings"; "分享"="Share"; "评价"="Rate"; "关于"="About"; //Settings "版本"="Version"; "退出登录"="Log Out"; //About "关于"="About"; "我"="Me"; //repo view "关注"="Watch"; "取消关注"="Unwatch"; "收藏"="Star"; "取消收藏"="Unstar"; "派生"="Fork"; "公开"="Public"; "私有"="Private"; "创建"="catated at"; //user view "加入于"="Joined on"; "关注"="Follow"; "取消关注"="Unfollow"; /*****中文转英文 End******/ ================================================ FILE: BeeFun/BeeFun/Resources/Localizable/zh-Hans.lproj/Localizable.strings ================================================ /* Localizable.strings BeeFun Created by WengHengcong on 2017/3/13. Copyright © 2017年 JungleSong. All rights reserved. */ /*****英文转中文 Start******/ //explore "Explore" = "发现"; "Repositories" = "项目"; "Developers" = "用户"; "Showcases"="列表"; //filter "Since"="时间"; "daily"="每天"; "weekly"="每周"; "monthly"="每月"; //search "All" = "全部"; "Language"="语言"; "Country"="国家"; "Sort"="排序"; "Reset"="重置"; "Sure"="确认"; "Best match"="最优匹配"; "Most stars"="收藏最多"; "Fewest stars"="收藏最少"; "Most forks"="派生最多"; "Fewest forks"="派生最少"; "Recently updated"="更新最近"; "Leaest recently updated"="更新最少"; "Search repositories"="搜索项目"; "Search users"="搜索用户"; "Best match"="最优匹配"; "Most followers"="粉丝最多"; "Fewest followers"="粉丝最少"; "Most recently joined"="加入最新"; "Leaest recently joined"="加入最旧"; "Most repositories"="项目最多"; "Fewest repositories"="项目最少"; //Message "Message" = "消息"; "Notifications"="通知"; "Issues"="讨论"; //Stars "Stars" = "收藏"; "Event"="事件"; //Profile "Profile" = "我"; "Sign in"="登录"; "Followers"="粉丝"; "Following"="关注"; "Watched"="关注"; "Feedback"="反馈"; "Settings"="设置"; "Share"="分享"; "Rate"="评价"; "About"="关于"; "Edit"="编辑"; //Settings "Version"="版本"; "Log Out"="退出登录"; //About //"About"="About"; "Me"="我"; //repo view "Watch"="关注"; "Unwatch"="取消关注"; "Star"="收藏"; "Unstar"="取消收藏"; "Fork"="派生"; "Public"="公开"; "Private"="私有"; "catated at"="创建"; //user view "Joined on"="加入于"; "Follow"="关注"; "Unfollow"="取消关注"; "Follower"="粉丝"; "Repositories"="项目"; "Following"="关注"; "Submit"="提交"; "Title can't be empty"="标题不能为空"; "bug? function?..."="bug,功能建议...."; //长文本 " BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks." = " BeeFun ,是使用Swift语言编写的Github客户端。欢迎大家能提出更多的建议和反馈bugs。"; "registers the user to receive notifications on new discussions" = "用户关注后,可以接受新讨论的通知"; "lets users bookmark repositories."="用户可以收藏项目"; "A fork is a copy of a repository."="拷贝项目"; "Suggestions or report bugs"="建议或者提报Bugs"; "Could not send Email"="无法发送邮件"; "Your device could not send e-mail. Please check e-mail configuration and try again."="您的设备无法发送邮件,请检查【设置】中【邮件】设置,然后重试。"; "Immediately sync your star repositories from github.com in silence."="点击‘同步’按钮,将会及时同步您GitHub账户下Star repositories"; "Sync"="同步"; //提醒 "Share Success"="分享成功"; "Share Failure"="分享失败"; "Share Cancel"="取消分享"; "Please login first"="请先登录"; "No Data Found"="没有找到宝藏"; "Release to refresh"="松开刷新"; "Pull down to refresh"="下拉刷新"; "Load"="加载"; "Loading"="加载中"; "More"="更多"; "No More data"="😭没有更多数据啦"; "Network error /(ㄒoㄒ)/~~"="呀,网络正在开小差~"; "Sign in Now?" = "立刻登录?"; "access data ask github account"="访问这些数据,需要登录Github账户"; "Watch?"="是否关注"; "Unwatch?"="是否取消关注?"; "Unstar?"="是否取消收藏?"; "Star?"="是否收藏?"; "Fork?"="是否派生?"; "Watch Success"="关注成功"; "Unwatch Success"="取消关注"; "Star Success"="收藏成功"; "Unstar Success"="取消收藏"; "Fork Success"="派生成功"; "Follow Success"="关注成功"; "UnFollow Success"="取消关注"; //其他 "Unknown" = "未知"; "Success"="成功"; "created at"="创建于"; "Homepage"="主页"; "Cancel"="取消"; "Failure"="失败"; "Repository"="项目"; "Tags"="标签"; "All Tags"="所有标签"; "Save"="保存"; "Save Tags?"="保存本次编辑"; "Add new tag"="新建标签"; "input new tag name"="输入新标签名字"; "input tag"="输入标签"; "Already exists!"="已经存在!"; "No tag to save"="无须保存"; "Demo" = "示例"; "Edit"="编辑"; "Trash"="删除"; "OK"="好的"; "make a change"="换个新名字试试"; "Lists"="列表"; //其他 "Owner"="用户"; "Join"="加入"; "Location"="位置"; "Company"="公司"; "Name"="用户名"; "Email"="邮箱"; "Blog"="博客"; "Hireable"="在职"; "Bio"="简介"; "Trash it will remove this tag from star repositories!"="删除后,将从所有star项目中移除该tag"; "Sync start"="同步开始"; "Sync end"="同步完成"; "Delete"="删除"; //搜索 "Historical records" = "历史记录"; "Clear All Records" = "清除所有记录"; "Search repositories、users..." = "搜索项目、用户..."; "Clear all history records?" = "是否删除所有历史记录?"; "Forks" = "派生"; "Updated" = "更新"; "Users"="用户"; "Search"="搜索"; "Joined"="加入"; "Comments"="评论"; "Created"="创建"; "Repo"="项目"; "Foll"="粉丝"; "Comm"="评论"; "Join"="加入"; "Creat"="创建"; //分享 "It's A Wonderful Repository from github! Hurry UP!" = "这么棒的项目,赶紧来看看!"; "from BeeFun App"="来源BeeFun App"; "Download Here"="点击下载"; "A Talented Developer"="一位天才开发者"; "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top" = "BeeFun,优秀的Github客户端。 下载: http://t.cn/RinAeZq \n 官网: http://www.beefun.top"; "Update Failure" = "更新失败"; "'All' is default,change one."="'All'是默认tag,换一个吧"; "Try Again"="重新加载"; "Wake up your connection!" = "网络走丢了,快去找回来!"; "Empty now"="暂无数据,去添加吧!"; "Go"="Go"; "Explore more"="探索更多"; "Empty now,star repositories and tag it"="没有数据,去收藏标记项目吧!"; /*****英文转中文 End******/ /*****中文转英文 Start******/ //explore "发现" = "发现"; "项目" = "项目"; "用户" = "用户"; "列表"="列表"; //filter "时间"="时间"; "每天"="每天"; "每周"="每周"; "每月"="每月"; "全部"="全部"; //country "中国"="中国"; "美国"="美国"; "印度"="印度"; "日本"="日本"; "韩国"="韩国"; "巴西"="巴西"; "德国"="德国"; "俄罗斯"="俄罗斯"; "英国"="英国"; "法国"="法国"; "西班牙"="西班牙"; "加拿大"="加拿大"; "新加坡"="新加坡"; "荷兰"="荷兰"; "意大利"="意大利"; "瑞士"="瑞士"; "澳大利亚"="澳大利亚"; //City "北京"="北京"; "上海"="上海"; "深圳"="深圳"; "杭州"="杭州"; "广州"="广州"; "成都"="成都"; "南昌"="南昌"; //search "全部"="全部"; "语言"="语言"; "国家"="国家"; "排序"="排序"; "重置"="重置"; "确认"="确认"; "最优匹配"="最优匹配"; "收藏最多"="收藏最多"; "收藏最少"="收藏最少"; "派生最多"="派生最多"; "派生最少"="派生最少"; "更新最近"="更新最近"; "更新最少"="更新最少"; "搜索项目"="搜索项目"; "搜索用户"="搜索用户"; "最优匹配"="最优匹配"; "粉丝最多"="粉丝最多"; "粉丝最少"="粉丝最少"; "加入最新"="加入最新"; "加入最旧"="加入最旧"; "项目最多"="项目最多"; "项目最少"="项目最少"; //Message "消息" = "消息"; "通知"="通知"; "讨论"="讨论"; //Stars "收藏" = "收藏"; "项目"="项目"; "事件"="事件"; //Profile "我" = "我"; "登录"="登录"; "粉丝"="粉丝"; "关注"="关注"; "关注项目"="关注项目"; "反馈"="反馈"; "设置"="设置"; "分享"="分享"; "评价"="评价"; "关于"="关于"; //Settings "版本"="版本"; "退出登录"="退出登录"; //About //"About"="About"; "我"="我"; //repo view "关注"="关注"; "取消关注"="取消关注"; "收藏"="收藏"; "取消收藏"="取消收藏"; "派生"="派生"; "公开"="公开"; "私有"="私有"; "创建"="创建"; //user view "加入于"="加入于"; "关注"="关注"; "取消关注"="取消关注"; /*****中文转英文 End******/ ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFLanguage.plist ================================================ All 1C Enterprise ABAP ABNF ActionScript Ada Agda AGS Script Alloy Alpine Abuild AMPL Ant Build System ANTLR ApacheConf Apex API Blueprint APL Apollo Guidance Computer AppleScript Arc Arduino AsciiDoc ASN.1 ASP AspectJ Assembly ATS Augeas AutoHotkey AutoIt Awk Batchfile Befunge Bison BitBake Blade BlitzBasic BlitzMax Bluespec Boo Brainfuck Brightscript Bro C C# C++ C-ObjDump C2hs Haskell Cap'n Proto CartoCSS Ceylon Chapel Charity ChucK Cirru Clarion Clean Click CLIPS Clojure Closure Templates CMake COBOL CoffeeScript ColdFusion ColdFusion CFC COLLADA Common Lisp Component Pascal Cool Coq Cpp-ObjDump Creole Crystal CSON Csound Csound Document Csound Score CSS CSV Gherkin Cuda CWeb Cycript Cython D D-ObjDump Darcs Patch Dart desktop Diff DIGITAL Command Language DM DNS Zone Dockerfile Dogescript DTrace Dylan E Eagle EBNF eC Ecere Projects ECL ECLiPSe edn Eiffel EJS Elixir Elm Emacs Lisp EmberScript EQ Erlang F# Factor Fancy Fantom Filebench WML Filterscript fish FLUX Formatted Forth Fortran FreeMarker Frege G-code Game Maker Language GAMS GAP GCC Machine Description GDB GDScript Genie Genshi Gentoo Ebuild Gentoo Eclass Gettext Catalog Gherkin GLSL Glyph GN Gnuplot Go Golo Gosu Grace Gradle Grammatical Framework Graph Modeling Language GraphQL Graphviz (DOT) Groovy Groovy Server Pages Hack Haml Handlebars Harbour Haskell Haxe HCL HLSL HTML HTML+Django HTML+ECR HTML+EEX HTML+ERB HTML+PHP HTTP Hy HyPhy IDL Idris IGOR Pro Inform 7 INI Inno Setup Io Ioke IRC log Isabelle Isabelle ROOT J Jasmin Java Java Server Pages JavaScript JFlex Jison Jison Lex Jolie JSON JSON5 JSONiq JSONLD JSX Julia Jupyter Notebook KiCad Kit Kotlin KRL LabVIEW Lasso Latte Lean Less Lex LFE LilyPond Limbo Linker Script Linux Kernel Module Liquid Literate Agda Literate CoffeeScript Literate Haskell LiveScript LLVM Logos Logtalk LOLCODE LookML LoomScript LSL Lua M M4 M4Sugar Makefile Mako Markdown Marko Mask Mathematica Matlab Maven POM Max MAXScript MediaWiki Mercury Meson Metal MiniD Mirah Modelica Modula-2 Module Management System Monkey Moocode MoonScript MQL4 MQL5 MTML MUF mupad Myghty NCL Nemerle nesC NetLinx NetLinx+ERB NetLogo NewLisp Nginx Nim Ninja Nit Nix NL NSIS Nu NumPy ObjDump Objective-C Objective-C++ Objective-J OCaml Omgrofl ooc Opa Opal OpenCL OpenEdge ABL OpenRC runscript OpenSCAD OpenType Feature File Org Ox Oxygene Oz P4 Pan Papyrus Parrot Parrot Assembly Parrot Internal Representation Pascal PAWN Pep8 Perl Perl6 PHP Pic Pickle PicoLisp PigLatin Pike PLpgSQL PLSQL Pod PogoScript Pony PostScript POV-Ray SDL PowerBuilder PowerShell Processing Prolog Propeller Spin Protocol Buffer Public Key Pug Puppet Pure Data PureBasic PureScript Python Python console Python traceback QMake QML R Racket Ragel RAML Rascal Raw token data RDoc REALbasic Reason Rebol Red Redcode Regular Expression Ren'Py RenderScript reStructuredText REXX RHTML RMarkdown RobotFramework Roff Rouge RPM Spec Ruby RUNOFF Rust Sage SaltStack SAS Sass Scala Scaml Scheme Scilab SCSS Self ShaderLab Shell ShellSession Shen Slash Slim Smali Smalltalk Smarty SMT SourcePawn SPARQL Spline Font Database SQF SQL SQLPL Squirrel SRecode Template Stan Standard ML Stata STON Stylus Sublime Text Config SubRip Text SuperCollider SVG Swift SystemVerilog Tcl Tcsh Tea Terra TeX Text Textile Thrift TI Program TLA TOML Turing Turtle Twig TXL TypeScript Unified Parallel C Unity3D Asset Unix Assembly Uno UnrealScript UrWeb Vala VCL Verilog VHDL Vim script Vim script Visual Basic Volt Vue Wavefront Material Wavefront Object Web Ontology Language WebIDL wisp World of Warcraft Addon Data X10 xBase XC XCompose XML Xojo XPages XProc XQuery XS XSLT Xtend Yacc YAML YANG Zephir Zimpl ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFPopularLanguage.plist ================================================ ActionScript C C# C++ Clojure CoffeeScript CSS Go Haskell HTML Java JavaScript Lua Matlab Objective-C Perl PHP Python R Ruby Scala Shell Swift TeX Vim script ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/BFSetting.plist ================================================ type label id version key Version value 1.0 disclosure type label id language key Language value Change to Chinese type label id rate key Rate disclosure type label id about key About disclosure ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPCity.plist ================================================ All Beijing Shanghai Shenzhen Hangzhou Guangzhou Chengdu NanChang ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPCountry.plist ================================================ All China USA India Japan Korea Brazil Germany Russia UK France Spain Canada Singapore Netherlands Italy Switzerland Australia ================================================ FILE: BeeFun/BeeFun/Resources/plist/en.lproj/CPFilterLanguage.plist ================================================ All Java C C++ C# PHP Python Javascript Swift Kotlin Perl Ruby Assembly language Objective-C Objective-C++ CSS HTML R Go PLSQL MATLAB SQL SQLPL Pascal Assembly Visual Basic Rust D Bash ASP COBOL ABAP SAS Scratch Dart Fortran Lisp Ada Lua Scala Logo Prolog F# Haskell Clojure LabVIEW CoffeeScript Hack Rust Apex Scheme Awk Erlang MQL4 Groovy ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFLanguage.plist ================================================ All 1C Enterprise ABAP ABNF ActionScript Ada Agda AGS Script Alloy Alpine Abuild AMPL Ant Build System ANTLR ApacheConf Apex API Blueprint APL Apollo Guidance Computer AppleScript Arc Arduino AsciiDoc ASN.1 ASP AspectJ Assembly ATS Augeas AutoHotkey AutoIt Awk Batchfile Befunge Bison BitBake Blade BlitzBasic BlitzMax Bluespec Boo Brainfuck Brightscript Bro C C# C++ C-ObjDump C2hs Haskell Cap'n Proto CartoCSS Ceylon Chapel Charity ChucK Cirru Clarion Clean Click CLIPS Clojure Closure Templates CMake COBOL CoffeeScript ColdFusion ColdFusion CFC COLLADA Common Lisp Component Pascal Cool Coq Cpp-ObjDump Creole Crystal CSON Csound Csound Document Csound Score CSS CSV Gherkin Cuda CWeb Cycript Cython D D-ObjDump Darcs Patch Dart desktop Diff DIGITAL Command Language DM DNS Zone Dockerfile Dogescript DTrace Dylan E Eagle EBNF eC Ecere Projects ECL ECLiPSe edn Eiffel EJS Elixir Elm Emacs Lisp EmberScript EQ Erlang F# Factor Fancy Fantom Filebench WML Filterscript fish FLUX Formatted Forth Fortran FreeMarker Frege G-code Game Maker Language GAMS GAP GCC Machine Description GDB GDScript Genie Genshi Gentoo Ebuild Gentoo Eclass Gettext Catalog Gherkin GLSL Glyph GN Gnuplot Go Golo Gosu Grace Gradle Grammatical Framework Graph Modeling Language GraphQL Graphviz (DOT) Groovy Groovy Server Pages Hack Haml Handlebars Harbour Haskell Haxe HCL HLSL HTML HTML+Django HTML+ECR HTML+EEX HTML+ERB HTML+PHP HTTP Hy HyPhy IDL Idris IGOR Pro Inform 7 INI Inno Setup Io Ioke IRC log Isabelle Isabelle ROOT J Jasmin Java Java Server Pages JavaScript JFlex Jison Jison Lex Jolie JSON JSON5 JSONiq JSONLD JSX Julia Jupyter Notebook KiCad Kit Kotlin KRL LabVIEW Lasso Latte Lean Less Lex LFE LilyPond Limbo Linker Script Linux Kernel Module Liquid Literate Agda Literate CoffeeScript Literate Haskell LiveScript LLVM Logos Logtalk LOLCODE LookML LoomScript LSL Lua M M4 M4Sugar Makefile Mako Markdown Marko Mask Mathematica Matlab Maven POM Max MAXScript MediaWiki Mercury Meson Metal MiniD Mirah Modelica Modula-2 Module Management System Monkey Moocode MoonScript MQL4 MQL5 MTML MUF mupad Myghty NCL Nemerle nesC NetLinx NetLinx+ERB NetLogo NewLisp Nginx Nim Ninja Nit Nix NL NSIS Nu NumPy ObjDump Objective-C Objective-C++ Objective-J OCaml Omgrofl ooc Opa Opal OpenCL OpenEdge ABL OpenRC runscript OpenSCAD OpenType Feature File Org Ox Oxygene Oz P4 Pan Papyrus Parrot Parrot Assembly Parrot Internal Representation Pascal PAWN Pep8 Perl Perl6 PHP Pic Pickle PicoLisp PigLatin Pike PLpgSQL PLSQL Pod PogoScript Pony PostScript POV-Ray SDL PowerBuilder PowerShell Processing Prolog Propeller Spin Protocol Buffer Public Key Pug Puppet Pure Data PureBasic PureScript Python Python console Python traceback QMake QML R Racket Ragel RAML Rascal Raw token data RDoc REALbasic Reason Rebol Red Redcode Regular Expression Ren'Py RenderScript reStructuredText REXX RHTML RMarkdown RobotFramework Roff Rouge RPM Spec Ruby RUNOFF Rust Sage SaltStack SAS Sass Scala Scaml Scheme Scilab SCSS Self ShaderLab Shell ShellSession Shen Slash Slim Smali Smalltalk Smarty SMT SourcePawn SPARQL Spline Font Database SQF SQL SQLPL Squirrel SRecode Template Stan Standard ML Stata STON Stylus Sublime Text Config SubRip Text SuperCollider SVG Swift SystemVerilog Tcl Tcsh Tea Terra TeX Text Textile Thrift TI Program TLA TOML Turing Turtle Twig TXL TypeScript Unified Parallel C Unity3D Asset Unix Assembly Uno UnrealScript UrWeb Vala VCL Verilog VHDL Vim script Vim script Visual Basic Volt Vue Wavefront Material Wavefront Object Web Ontology Language WebIDL wisp World of Warcraft Addon Data X10 xBase XC XCompose XML Xojo XPages XProc XQuery XS XSLT Xtend Yacc YAML YANG Zephir Zimpl ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFPopularLanguage.plist ================================================ ActionScript C C# C++ Clojure CoffeeScript CSS Go Haskell HTML Java JavaScript Lua Matlab Objective-C Perl PHP Python R Ruby Scala Shell Swift TeX Vim script ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/BFSetting.plist ================================================ type label id version key 版本 value 1.0 disclosure type label id language key 语言 value 切换到英语 type label id rate key 评价 disclosure type label id about key 关于 disclosure ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPCity.plist ================================================ 全部 北京 上海 深圳 杭州 广州 成都 南昌 ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPCountry.plist ================================================ 全部 中国 美国 印度 日本 韩国 巴西 德国 俄罗斯 英国 法国 西班牙 加拿大 新加坡 荷兰 意大利 瑞士 澳大利亚 ================================================ FILE: BeeFun/BeeFun/Resources/plist/zh-Hans.lproj/CPFilterLanguage.plist ================================================ All Java C C++ C# PHP Python Javascript Swift Kotlin Perl Ruby Assembly language Objective-C Objective-C++ CSS HTML R Go PLSQL MATLAB SQL SQLPL Pascal Assembly Visual Basic Rust D Bash ASP COBOL ABAP SAS Scratch Dart Fortran Lisp Ada Lua Scala Logo Prolog F# Haskell Clojure LabVIEW CoffeeScript Hack Rust Apex Scheme Awk Erlang MQL4 Groovy ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Oauth/OAuthGithubWebController.swift ================================================ // // OAuthWebViewController.swift // BeeFun // // Created by WengHengcong on 2018/1/24. // Copyright © 2018年 LuCi. All rights reserved. // import OAuthSwift import WebKit import MBProgressHUD typealias WebView = WKWebView class OAuthGithubWebController: OAuthWebViewController { var targetURL: URL? let webView: WebView = WebView() var progressHud: MBProgressHUD = MBProgressHUD() override func viewDidLoad() { super.viewDidLoad() self.title = "Sign in to GitHub" configWebView() configHudView() } func configWebView() { self.webView.frame = UIScreen.main.bounds self.webView.navigationDelegate = self self.hidesBottomBarWhenPushed = true self.view.addSubview(self.webView) self.webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil) } func configHudView() { progressHud = MBProgressHUD.init(view: self.view) progressHud.mode = .determinate progressHud.delegate = self progressHud.removeFromSuperViewOnHide = true progressHud.label.text = "On the way..." } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if (keyPath == "estimatedProgress") { progressHud.progress = Float(webView.estimatedProgress) if webView.estimatedProgress >= 0.7 { let _ : Void = { hideHud() }() } } } override func handle(_ url: URL) { targetURL = url super.handle(url) self.loadAddressURL() } func loadAddressURL() { guard let url = targetURL else { return } let req = URLRequest(url: url) showHud() self.webView.load(req) } func showHud() { progressHud.show(animated: true) self.view.addSubview(progressHud) } func hideHud() { progressHud.hide(animated: true) } } extension OAuthGithubWebController: WKNavigationDelegate { func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // here we handle internally the callback url and call method that call handleOpenURL (not app scheme used) if let url = navigationAction.request.url, url.scheme == "beefunios" { AppDelegate.sharedInstance.applicationHandle(url: url) decisionHandler(.cancel) return } decisionHandler(.allow) } func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { print("\(error)") self.dismissWebViewController() // maybe cancel request... } } extension OAuthGithubWebController: MBProgressHUDDelegate { func hudWasHidden(_ hud: MBProgressHUD) { progressHud.removeFromSuperview() } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Oauth/OAuthManager.swift ================================================ // // OAuthManager.swift // BeeFunMac // // Created by WengHengcong on 2018/1/24. // Copyright © 2018年 LuCi. All rights reserved. // import OAuthSwift import ObjectMapper import Alamofire class OAuthManager: NSObject { static let shared = OAuthManager() var oauthswift: OAuthSwift? lazy var internalWebViewController: OAuthGithubWebController = { let controller = OAuthGithubWebController() controller.delegate = self controller.viewDidLoad() // allow WebViewController to use this ViewController as parent to be presented return controller }() // MARK: - Github Oauth and save Token func beginOauth() { BFNetworkManager.clearCache() BFNetworkManager.clearCookies() //全局通知:将要登录 NotificationCenter.default.post(name: NSNotification.Name.BeeFun.WillLogout, object: nil) let oauthswift = OAuth2Swift( consumerKey: GithubAppClientId, consumerSecret: GithubAppClientSecret, authorizeUrl: "https://github.com/login/oauth/authorize", accessTokenUrl: "https://github.com/login/oauth/access_token", responseType: "code" ) self.oauthswift = oauthswift oauthswift.authorizeURLHandler = getURLHandler(external: false) let state = generateState(withLength: 20) _ = oauthswift.authorize(withCallbackURL: nil, scope: GithubAppScope, state: state, completionHandler: { ( result ) in switch result { case .success(let (credential, _, parameters)): print(credential.oauthToken) if credential != nil && parameters != nil && parameters.keys.count > 0 { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.GetOAuthToken, object: nil) self.saveOauthToken(credential: credential, parameters: parameters) } // Do your request case .failure(let error): print(error.localizedDescription) } }) } func getURLHandler(external: Bool) -> OAuthSwiftURLHandlerType { if external { return OAuthSwiftOpenURLExternally.sharedInstance } else { if internalWebViewController.parent == nil { BFTabbarManager.shared.jsTopViewController()?.addChild(internalWebViewController) } return internalWebViewController } } func saveOauthToken(credential: OAuthSwiftCredential, parameters: [String: Any]) { let token = AppToken.shared token.access_token = String(format: "token %@", credential.oauthToken) if let token_type: String = parameters["token_type"] as? String { token.token_type = token_type } if let token_scope: String = parameters["scope"] as? String { token.scope = token_scope } if let token_expireDate: Date = credential.oauthTokenExpiresAt { token.token_expire_date = token_expireDate } print(credential.oauthToken) self.getUserinfo(token.access_token!) } // MARK: - 获取个人信息 private func getUserinfo(_ token: String) { self.internalWebViewController.showHud() let provider = Provider.sharedProvider provider.request(.myInfo) { (result) -> Void in switch result { case let .success(response): do { if let gitUser: ObjUser = Mapper().map(JSONObject: try response.mapJSON()) { ObjUser.saveUserInfo(gitUser) //全局通知:已经登录 self.internalWebViewController.hideHud() self.didLogin() } else { } } catch { } case .failure: break } } } private func didLogin() { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DidLogin, object: nil) NotificationCenter.default.post(name: NSNotification.Name.BeeFun.GetUserInfo, object: nil) BFTabbarManager.shared.jsTopNavigationViewController()?.popViewController(animated: true) UserManager.shared.updateUserInfo() } } // MARK: - OAuthWebViewControllerDelegate extension OAuthManager: OAuthWebViewControllerDelegate { func oauthWebViewControllerDidPresent() { } func oauthWebViewControllerDidDismiss() { } func oauthWebViewControllerWillAppear() { } func oauthWebViewControllerDidAppear() { } func oauthWebViewControllerWillDisappear() { } func oauthWebViewControllerDidDisappear() { // Ensure all listeners are removed if presented web view close oauthswift?.cancel() } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Push/BFMessageManager.swift ================================================ // // BFMessageManager.swift // BeeFun // // Created by 翁恒丛 on 2018/6/19. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import UserNotifications enum PushMessageService: String { case m case versionUpgrade } class BFMessageManager: NSObject { static let serviceTypeKey = "serviceType" static let landpageUrl = "landpageUrl" // MARK: - iOS 10以下推送处理 /// 处理本地推送 static func receiveLocalNotificaion(notification: UILocalNotification) { if let userinfo = notification.userInfo { handleLocalNotification(userInfo: userinfo) } } /// 处理远程推送 static func receiveRemoteNotification(userInfo: [AnyHashable: Any]) { handleRemoteNotification(userInfo: userInfo) } // MARK: - iOS 10推送处理 @available(iOS 10.0, *) /// 处理远程推送 static func receiveResponse(response: UNNotificationResponse) { if let userinfo = JPushManager.shared.userinfoWithUNNotification(notification: response), let trigger = response.notification.request.trigger { if trigger.isKind(of: UNPushNotificationTrigger.self) { handleRemoteNotification(userInfo: userinfo) } else { handleLocalNotification(userInfo: userinfo) } } } @available(iOS 10.0, *) /// 前台处理远程推送 static func receiveNotification(notification: UNNotification) { if let userinfo = JPushManager.shared.userinfoWithUNNotification(notification: notification), let trigger = notification.request.trigger { if trigger.isKind(of: UNPushNotificationTrigger.self) { appActiveHandleRemoteNotification(userInfo: userinfo) } else { appActiveHandleLocalNotification(userInfo: userinfo) } } } // MARK: - 远程推送 /// 后台处理远程推送 private static func handleRemoteNotification(userInfo: [AnyHashable: Any]) { JPUSHService.handleRemoteNotification(userInfo) if UIApplication.shared.applicationState == .inactive { appInactiveHandleRemoteNotification(userInfo: userInfo) } else { appActiveHandleRemoteNotification(userInfo: userInfo) } } /// 后台处理远程推送 private static func appInactiveHandleRemoteNotification(userInfo: [AnyHashable: Any]) { if let serviceType: String = userInfo[serviceTypeKey] as? String { let type: PushMessageService = PushMessageService(rawValue: serviceType)! switch type { case .m: if let url = userInfo["landpageUrl"] as? String { JumpManager.shared.jumpWebView(url: url) } default: break } } } /// 前台处理远程推送 private static func appActiveHandleRemoteNotification(userInfo: [AnyHashable: Any]) { } // MARK: - 本地推送 /// 处理本地推送 private static func handleLocalNotification(userInfo: [AnyHashable: Any]) { if UIApplication.shared.applicationState == .inactive { appInactiveHandleLocalNotification(userInfo: userInfo) } else { appActiveHandleLocalNotification(userInfo: userInfo) } } /// 后台处理本地推送 private static func appInactiveHandleLocalNotification(userInfo: [AnyHashable: Any]) { if let serviceType: String = userInfo["serviceType"] as? String { let type: PushMessageService = PushMessageService(rawValue: serviceType)! switch type { case .m: break default: break } } } /// 前台处理本地推送 private static func appActiveHandleLocalNotification(userInfo: [AnyHashable: Any]) { } /// 是否是静默推送 static func isSlientPush(userInfo: [AnyHashable: Any]) -> Bool { if userInfo.keys.count == 0 { return false } if let aps = userInfo["aps"] as? [AnyHashable: Any] { if let avaiable = aps["content-available"] as? NSNumber { if avaiable.intValue == 1 { return true } } } else { return false } return false } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Push/JPushManager.swift ================================================ // // JPushManager.swift // BeeFun // // Created by WengHengcong on 2018/6/9. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import UserNotifications class JPushManager: NSObject { static let shared = JPushManager() //Check list: 上线打开推送开关 var apsProduction: Bool = true override init() { super.init() } convenience init(launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { self.init() NotificationCenter.default.addObserver(self, selector: #selector(setAlias), name: NSNotification.Name.BeeFun.DidLogin, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(deleteAlias), name: NSNotification.Name.BeeFun.DidLogout, object: nil) register(launchOptions: launchOptions) } func register(launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { JPUSHService.setup(withOption: launchOptions, appKey: JPushAppKey, channel: JPushChannel, apsForProduction: apsProduction) let pushConfig = JPUSHRegisterEntity.init() let pushSwitch = (UIUserNotificationType.badge.rawValue|UIUserNotificationType.sound.rawValue|UIUserNotificationType.alert.rawValue) pushConfig.types = Int(pushSwitch) JPUSHService.register(forRemoteNotificationConfig: pushConfig, delegate: nil) } func checkAlias() { if UserManager.shared.isLogin { UserManager.shared.updateUserInfo() setAlias() } else { deleteAlias() } } @objc private func setAlias() { if let userlogin = UserManager.shared.login { JPUSHService.setAlias(userlogin, completion: { (_, _, _) in }, seq: 0) } } @objc private func deleteAlias() { JPUSHService.deleteAlias({ (_, _, _) in }, seq: 0) } // 取出通知中对应的Userinfo func userinfoWithUNNotification(notification: AnyObject) -> [AnyHashable: Any]? { if #available(iOS 10.0, *) { if notification.isKind(of: UNNotification.self) { if let noti: UNNotification = notification as? UNNotification { return noti.request.content.userInfo } } else if notification.isKind(of: UNNotificationResponse.self) { if let noti: UNNotificationResponse = notification as? UNNotificationResponse { return noti.notification.request.content.userInfo } } return nil } return nil } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/AnswerManager.swift ================================================ // // AnswerManager.swift // BeeFun // // Created by WengHengcong on 2017/4/13. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import Crashlytics enum ContentViewType: String { case pv = "pv" //用于页面willappear统计该页面的pv case uv = "uv" //用于页面didload中统计该页面的uv case tm = "time" //用于页面小时disappear中统计该页面的时长 case web = "webview" //用于统计网页 } enum UserActionType: String { case follow case unfollow case star case unstar case fork case watch case unwatch } class AnswerManager: NSObject { /// 内容统计 /// /// - Parameters: /// - name: 名称 /// - type: 类型 /// - id: 唯一标识 /// - attributes: 自定义字段 class func logContentView(name: String?, type: String?, id: String?, attributes: [String : Any]? = nil) { Answers.logContentView(withName: name, contentType: type, contentId: id, customAttributes: attributes) } /// 登录统计 /// /// - Parameters: /// - method: 登录方式:微信\QQ\FB\TW /// - success: 登录结果 /// - attributes: 自定义字段 class func logLogin(method: String?, success: NSNumber?, attributes: [String : Any]? = nil) { Answers.logLogin(withMethod: method, success: success, customAttributes: attributes) } /// 搜索统计 /// /// - Parameters: /// - query: 搜索字符串 /// - attributes: 自定义字段 class func logSearch(query: String?, attributes: [String : Any]? = nil) { Answers.logSearch(withQuery: query, customAttributes: attributes) } /// 分享统计 /// /// - Parameters: /// - method: 分享途径 /// - name: 分享标题 /// - type: 分享类型:defalut、app、repository、user /// - id: 分享唯一标识 /// - attributes: 自定义字段 class func logShare(method: String?, name: String?, type: String?, id: String?, attributes: [String : Any]? = nil) { Answers.logShare(withMethod: method, contentName: name, contentType: type, contentId: id, customAttributes: attributes) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/KPIManager.swift ================================================ // // KPIManager.swift // BeeFun // // Created by WengHengcong on 2017/4/13. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class KPIManager: NSObject { static let shared = KPIManager() override init() { super.init() } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/PayManager.swift ================================================ // // PayManager.swift // BeeFun // // Created by WengHengcong on 2017/3/30. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class PayManager: NSObject { class func aliPayMe() { let aliURL = URL(string: kAliPayMe)! if UIApplication.shared.canOpenURL(aliURL) { UIApplication.shared.openURL(aliURL) } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/PurchaseManager.swift ================================================ // // PurchaseManager.swift // BeeFun // // Created by WengHengcong on 2017/3/31. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit //import SwiftyStoreKit enum PurchaseProduct: String { case reward = "com.junglesong.coderpursue.1025" } class PurchaseManager: NSObject { static let shared = PurchaseManager() /* func getInfo(_ purchase: PurchaseProduct) { SwiftyStoreKit.retrieveProductsInfo([purchase.rawValue]) { result in if let product = result.retrievedProducts.first { let priceString = product.localizedPrice! print("Product: \(product.localizedDescription), price: \(priceString)") } else if let invalidProductId = result.invalidProductIDs.first { } else { print("Error: \(String(describing: result.error))") } } } func purchase(_ purchase: PurchaseProduct) { SwiftyStoreKit.purchaseProduct(purchase.rawValue, atomically: true) { result in if case .success(let product) = result { // Deliver content from server, then: if product.needsFinishTransaction { SwiftyStoreKit.finishTransaction(product.transaction) } } } } func verifyPurchase(_ purchase: PurchaseProduct) { let appleValidator = AppleReceiptValidator(service: .production) SwiftyStoreKit.verifyReceipt(using: appleValidator, password: "your-shared-secret") { result in switch result { case .success(let receipt): let productId = purchase.rawValue switch purchase { case .reward: break default: let purchaseResult = SwiftyStoreKit.verifyPurchase( productId: productId, inReceipt: receipt ) } case .error(let error): if case .noReceiptData = error { } } } } */ } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/ThirdParty/ShareManager.swift ================================================ // // ShareManager.swift // BeeFun // // Created by WengHengcong on 2017/3/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit //TODO:分享App 到微信收藏总是失败 /// 分享状态的代理 protocol shareResponseProtocol: class { func didStateChange(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool) func didShareBegin(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool) func didShareSuccess(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool) func didShareFail(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool) func didShareCancel(state: SSDKResponseState, platform: SSDKPlatformType, userdata: [AnyHashable:Any]?, content: SSDKContentEntity?, error: Error?, end: Bool) } public enum ShareSource: String { case defalult = "defalut" case app = "app" case repository = "repository" case user = "user" } class ShareContent: NSObject { var source: ShareSource = .defalult /// 分享链接 var url: String? = "" /// 分享链接 var URL: URL? /// 分享标题 var title: String? /// 分享内容 var content: String? ///分享图片 var image: AnyObject? ///分享图片数组 var images: [AnyObject]? ///分享内容类型 var contentType: SSDKContentType? override init() { super.init() } } class ShareManager: NSObject { static let shared = ShareManager() /// 是否打开分享开关 /// Check list: 上线前check该开关 var enable: Bool = false var shareContent: ShareContent? = ShareContent() var shareInViewController: UIViewController? weak var delegate: shareResponseProtocol? var showPlatforms = [ SSDKPlatformType.typeSinaWeibo.rawValue, //微博 SSDKPlatformType.typeWechat.rawValue, //微信 SSDKPlatformType.typeTwitter.rawValue, //twitter SSDKPlatformType.typeFacebook.rawValue, //facebook //SSDKPlatformType.typeCopy.rawValue, //copy //SSDKPlatformType.typeSMS.rawValue, //sms SSDKPlatformType.typeQQ.rawValue, //QQ SSDKPlatformType.subTypeQZone.rawValue, //QQ空间 SSDKPlatformType.subTypeQQFriend.rawValue, //QQ好友 SSDKPlatformType.subTypeWechatTimeline.rawValue, //微信朋友圈 SSDKPlatformType.subTypeWechatFav.rawValue //微信收藏 //new add //SSDKPlatformType.typeYouDaoNote.rawValue, //SSDKPlatformType.typeDingTalk.rawValue, //SSDKPlatformType.typeLinkedIn.rawValue ] // MARK: - 公共方法 /** * 设置ShareSDK的appKey,如果尚未在ShareSDK官网注册过App,请移步到http://mob.com/login 登录后台进行应用注册 * 在将生成的AppKey传入到此方法中。 * 方法中的第二个第三个参数为需要连接社交平台SDK时触发, * 在此事件中写入连接代码。第四个参数则为配置本地社交平台时触发,根据返回的平台类型来配置平台信息。 * 如果您使用的时服务端托管平台信息时,第二、四项参数可以传入nil,第三项参数则根据服务端托管平台来决定要连接的社交SDK。 */ // MARK: 注册 /// 注册 func register() { ShareSDK.registerActivePlatforms(showPlatforms, onImport: { (platform : SSDKPlatformType) in // onImport 里的代码,需要连接社交平台SDK时触发 switch platform { case .typeSinaWeibo: ShareSDKConnector.connectWeibo(WeiboSDK.classForCoder()) case .typeWechat: ShareSDKConnector.connectWeChat(WXApi.classForCoder()) case .typeQQ: ShareSDKConnector.connectQQ(QQApiInterface.classForCoder(), tencentOAuthClass: TencentOAuth.classForCoder()) default: break } }) { (platform: SSDKPlatformType, appInfo) in switch platform { case .typeSinaWeibo: //设置新浪微博应用信息,其中authType设置为使用SSO+Web形式授权 appInfo?.ssdkSetupSinaWeibo(byAppKey:WeiboSDKAppKey, appSecret : WeiboSDKAppSecret, redirectUri :AppOfficeSite, authType : SSDKAuthTypeBoth) case .typeWechat: appInfo?.ssdkSetupWeChat(byAppId: WeiXinSDKAppID, appSecret: WeiXinSDKAppSecret) case .typeFacebook: //设置Facebook应用信息,其中authType设置为只用SSO形式授权 appInfo?.ssdkSetupFacebook(byApiKey: FackbookSDKAppID, appSecret: FackbookSDKAppSecret, authType: SSDKAuthTypeBoth) case .typeTwitter: //设置Twitter应用信息 appInfo?.ssdkSetupTwitter(byConsumerKey: TwitterSDKConsumerKey, consumerSecret : TwitterSDKConsumerSecret, redirectUri : AppOfficeSite) case .typeQQ: //设置QQ应用信息 appInfo?.ssdkSetupQQ(byAppId: TencentSDKAppID, appKey : TencentSDKAppKey, authType : SSDKAuthTypeBoth) /* case .typeLinkedIn: //设置LinkedIn应用信息 appInfo?.ssdkSetupLinkedIn(byApiKey: LinkedInSDKAppID, secretKey: LinkedInSDKAppSecret, redirectUrl: SocailRedirectURL) case .typeYouDaoNote: //设置YouDaoNote应用信息 appInfo?.ssdkSetupYouDaoNote(byConsumerKey:YDNoteSDKConsumerKey, consumerSecret: YDNoteSDKConsumerSecret, oauthCallback: SocailRedirectURL) case .typeDingTalk: appInfo?.ssdkSetupDingTalk(byAppId: DingTalkSDKAppID) */ default: break } } } // MARK: share方法 /// share方法 /// /// - Parameter content: 分享方法 func share(content: ShareContent) { print((content.source)) shareContent = content //1、创建分享参数(必要) let shareParams = shareParamsWithDifferentPlatforms() //2、分享视图的定制 SSUIShareActionSheetStyle.setShareActionSheetStyle(.simple) //3、分享 ShareSDK.showShareActionSheet(BFTabbarManager.shared.jsTopView()!, items: showPlatforms, shareParams: shareParams) { (state, platform, userdata, entity: SSDKContentEntity?, error: Error?, end: Bool) in let platformStr = String(describing:platform.rawValue) let stateStr = String(describing:state.rawValue) AnswerManager.logShare(method: platformStr, name: content.content, type: content.source.rawValue, id: content.title, attributes:["state": stateStr, "url": content.url ?? AppOfficeSite]) if let method = self.delegate?.didStateChange(state: platform: userdata: content: error: end:) { method(state, platform, userdata, entity, error, end) return } switch state { case .begin: print("开始分享") if let method = self.delegate?.didShareBegin(state: platform: userdata: content: error: end:) { method(state, platform, userdata, entity, error, end) } case SSDKResponseState.success: print("分享成功") JSMBHUDBridge.showSuccess("Share Success".localized) if let method = self.delegate?.didShareSuccess(state: platform: userdata: content: error: end:) { method(state, platform, userdata, entity, error, end) } case SSDKResponseState.fail: print("授权失败,错误描述:\(String(describing: error))") JSMBHUDBridge.showError("Share Failure".localized) if let method = self.delegate?.didShareFail(state: platform: userdata: content: error: end:) { method(state, platform, userdata, entity, error, end) } case SSDKResponseState.cancel: print("操作取消") // JSMBHUDBridge.showMessage("Share Cancel".localized, view: jsKeywindow!) if let method = self.delegate?.didShareCancel(state: platform: userdata: content: error: end:) { method(state, platform, userdata, entity, error, end) } case .beginUPLoad: break } } } // MARK: 分享APP /// 分享APP func shareApp() { let shareModel: ShareContent = ShareContent() shareModel.url = SocialAppStore shareModel.URL = URL(string: shareModel.url!) shareModel.content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top".cnLocalized shareModel.title = "BeeFun Github for iOS" shareModel.image = UIImage(named: "app_logo_90") shareModel.contentType = .app shareModel.source = .app shareContent = shareModel share(content: shareContent!) } // MARK: - 分享的参数 /// 分享的内容平台化定制 /// /// - Returns: <#return value description#> func shareParamsWithDifferentPlatforms() -> NSMutableDictionary { //处理好ShareContet中的属性 handleShareContet() var text = shareContent?.content let image = shareContent?.image let images = shareContent?.images let sURL = shareContent?.URL let title = shareContent?.title let contentType: SSDKContentType = (shareContent?.contentType)! let shareParams: NSMutableDictionary = NSMutableDictionary() shareParams.ssdkSetupShareParams(byText: text, images: images, url: sURL, title: title, type:.auto) //微信 shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatSession) shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatFav) shareParams.ssdkSetupWeChatParams(byText: text, title: title, url: sURL, thumbImage: nil, image: image, musicFileURL: nil, extInfo: nil, fileData: nil, emoticonData: nil, sourceFileExtension: nil, sourceFileData: nil, type: contentType, forPlatformSubType: .subTypeWechatTimeline) //QQ //只支持Text、Image、WebPage、Audio、Video shareParams.ssdkSetupQQParams(byText: text, title: title, url: sURL, audioFlash: nil, videoFlash: nil, thumbImage: image, images: images, type:.text, forPlatformSubType: .subTypeQQFriend) //Qzone //shareParams.ssdkSetupQQParams(byText: text, title: title, url: sURL, audioFlash: nil, videoFlash: nil, thumbImage: image, images: images, type: .auto, forPlatformSubType: .subTypeQZone) //微博 // TODO: 经纬度 //Text、Image、WebPage if shareContent?.source == .app { shareParams.ssdkSetupSinaWeiboShareParams(byText: text, title: title, image: images, url: sURL, latitude: 0.0, longitude: 0.0, objectID: nil, type: .auto) } else { // TODO: 微博高级API未通过审核,原因是用户数不够,所以,暂时只能以文本分享。 shareParams.ssdkSetupSinaWeiboShareParams(byText: text, title: title, image: images, url: sURL, latitude: 0.0, longitude: 0.0, objectID: nil, type: .text) } //英文 // TODO: 经纬度 if shareContent?.source == .app { //Twitter //Text、Image //Twitter支持140字符!!! let en_content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top" let en_title = "BeeFun,Github client for iOS" shareParams.ssdkSetupTwitterParams(byText: en_content, images: images, latitude: 0.0, longitude: 0.0, type: .auto) //Facebook shareParams.ssdkSetupFacebookParams(byText: en_content, image: image, url: sURL, urlTitle: en_title, urlName: nil, attachementUrl: nil, type: .webPage) } else { if (text?.count ?? 0) >= 140 { text = String((text ?? "").prefix(140)) shareParams.ssdkSetupTwitterParams(byText: text, images: images, latitude: 0.0, longitude: 0.0, type: .auto) } shareParams.ssdkSetupFacebookParams(byText: text, image: image, url: sURL, urlTitle: title, urlName: nil, attachementUrl: nil, type: .auto) } return shareParams } /// 处理分享内容ShareContet的属性 private func handleShareContet() { if shareContent == nil { return } //1.处理图片 //先处理是否有本地的UIImage if shareContent?.image != nil && shareContent?.images == nil { shareContent?.images = [(shareContent?.image)!] } if shareContent?.image == nil && shareContent?.images == nil { shareContent?.image = UIImage(named: "app_logo_90") shareContent?.images = [(shareContent?.image)!] } //2.处理URL if shareContent?.url == nil { shareContent?.url = AppOfficeSite } if shareContent?.url != nil && shareContent?.URL == nil { shareContent?.URL = URL(string: (shareContent?.url)!) } //3.title/content if shareContent?.title == nil { shareContent?.title = "BeeFun,Github client for iOS" } if shareContent?.content == nil { shareContent?.content = "BeeFun,excellent Github client. Download here: http://t.cn/RinAeZq \n Office website: http://www.beefun.top".cnLocalized } if shareContent?.contentType == nil { shareContent?.contentType = .auto } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFFeedbackManager.swift ================================================ // // BFFeedbackManager.swift // BeeFun // // Created by WengHengcong on 2018/7/6. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit class BFFeedbackManager: NSObject { static let shared = BFFeedbackManager() var adminLogin = "wenghengcong" var feedbackRepo = "BeeFunFeedback" } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFGlobalHelper.swift ================================================ // // BFGlobalHelper.swift // BeeFun // // Created by wenghengcong on 16/1/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Foundation class BFGlobalHelper { static let shared = BFGlobalHelper() /** calculator text size */ class func calculatorTextSize(_ text: String, size: CGSize, font: UIFont) -> CGRect { let boundingBox: CGRect = text.boundingRect(with: size, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil) return boundingBox } class func heightWithConstrainedWidth(_ text: String, width: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) let boundingBox = text.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil) return boundingBox.height } class func widthWithConstrainedHeight(_ text: String, height: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: CGFloat.greatestFiniteMagnitude, height: height) let boundingBox = text.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil) return boundingBox.width } /// 从Plist配置文件中读取配置 /// /// - Parameter file: plist文件名 class func readSettsingPlist(_ file: String) -> [[JSCellModel]] { var settingsArr: [[JSCellModel]] = [] if let path = Bundle.appBundle.path(forResource: file, ofType: "plist") { let dictArr = NSArray(contentsOfFile: path) if dictArr != nil { for item in dictArr! { var section: [JSCellModel] = [] let sectionArr = item as! [AnyObject] for rowdict in sectionArr { let settings = JSCellModel() settings.setValuesForKeys(rowdict as! Dictionary) section.append(settings) } settingsArr.append(section) } } } return settingsArr } /** app version */ } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFLanunchManager.swift ================================================ // // BFLanunchManager.swift // BeeFun // // Created by WengHengcong on 2018/6/19. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import IQKeyboardManagerSwift import Fabric import Crashlytics class BFLanunchManager: NSObject { static let shared = BFLanunchManager() // MARK: - Appdelegate func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { launchBeeFunService(application, didFinishLaunchingWithOptions: launchOptions) launchThirdParty(application, didFinishLaunchingWithOptions: launchOptions) launchDataAnalysis(application, didFinishLaunchingWithOptions: launchOptions) launchPushAndShare(application, didFinishLaunchingWithOptions: launchOptions) launchNetworkMonitor(application, didFinishLaunchingWithOptions: launchOptions) } func applicationDidBecomeActive(_ application: UIApplication) { //UMSocialSnsService.applicationDidBecomeActive() UIApplication.shared.applicationIconBadgeNumber = 0 } // MARK: - Launch func launchBeeFunService(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { JSCellFactory.registerCellInfo() //启动从Github拉取数据,更新服务端数据库 BeeFunDBManager.shared.updateServerDB(showTips: false, first: false) //设置语言 JSLanguage.initUserLanguage() UserManager.shared.updateUserInfo() //从GitHub获取语言列表,获取后固化为plist,不再需要 // LanguageManager.shared.requestForLanguage() } func launchThirdParty(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { //JSLog JSSwiftyBeaver.bridgeInit() // Override point for customization after application launch. IQKeyboardManager.shared.enable = true // Define a Region in Rome/Italy and set it as default region // Our Region also uses Gregorian Calendar and Italy Locale // let romeRegion = Region(tz: TimeZoneName.asiaShanghai, cal: CalendarName.gregorian, loc: LocaleName.chineseSimplified) // Date.setDefaultRegion(romeRegion) } func launchDataAnalysis(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { //友盟分析 UMAnalyticsConfig.sharedInstance().appKey = UMengAppSecret //发送策略:BATCH启动,SEND_INTERVAL,间隔发送 UMAnalyticsConfig.sharedInstance().ePolicy = SEND_INTERVAL MobClick.setAppVersion(JSApp.appVersion) MobClick.start(withConfigure: UMAnalyticsConfig.sharedInstance()) //bug // CrashReporter.shared().enableLog(true) // Bugly.start(withAppId: TencentBuglyAppID) //Fabric Fabric.with([Crashlytics.self]) Fabric.with([Answers.self]) #if DEBUG // GDPerformanceMonitor.sharedInstance.startMonitoring() #endif } func launchPushAndShare(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { UIApplication.shared.applicationIconBadgeNumber = 0 //JPush _ = JPushManager.init(launchOptions: launchOptions) JPushManager.shared.checkAlias() //ShareSDK // ShareManager.shared.register() } func launchNetworkMonitor(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { BFMonitor.shared.start() _ = BFNetworkManager.shared.startListening() } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFMonitor+Handle.swift ================================================ // // BFMonitor+Handle.swift // BeeFun // // Created by WengHengcong on 2018/1/25. // Copyright © 2018年 LuCi. All rights reserved. // extension BFMonitor { /// 登陆成功 @objc func userLogin(noti: NSNotification) { BeeFunDBManager.shared.updateServerDB(showTips: true, first: true) AnswerManager.logLogin(method: "Github", success: true, attributes: [:]) } /// 登出成功 @objc func userLogout(noti: NSNotification) { } @objc func syncStar() { JSMBHUDBridge.showText("Sync start".localized) } @objc func syncEnd() { JSMBHUDBridge.showText("Sync end".localized) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFMonitor.swift ================================================ // // BFMonitor.swift // BeeFun // // Created by WengHengcong on 2018/1/25. // Copyright © 2018年 LuCi. All rights reserved. // class BFMonitor: NSObject { static let shared = BFMonitor() override init() { super.init() NotificationCenter.default.addObserver(self, selector: #selector(userLogin(noti:)), name: NSNotification.Name.BeeFun.DidLogin, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(userLogout(noti:)), name: NSNotification.Name.BeeFun.DidLogout, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(syncStar), name: NSNotification.Name.BeeFun.SyncStarRepoStart, object: nil) NotificationCenter.default.addObserver(self , selector: #selector(syncEnd), name: NSNotification.Name.BeeFun.SyncStarRepoEnd, object: nil) } func start() { } func stop() { } func monitorRequest(_ url: String) { if url == "https://github.com/" { return } if url.contains("github.com/login") || url.contains("github.com/signin") { //打开登录页面 } else if url.contains("github.com/logout") || url.contains("github.com/signout") { //登出 UserManager.shared.userSignOut() } else if url.contains("github.com") && url.contains("subscription") { //star } else if url.contains("github.com/logout") || url.contains("github.com/signout") { //登出 } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFTabbarManager.swift ================================================ // // BFTabbarManager.swift // BeeFun // // Created by WengHengcong on 27/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFTabbarManager: NSObject { static let shared = BFTabbarManager() /// 应用的代理 static let jsAppDelegate: AppDelegate = { return UIApplication.shared.delegate as! AppDelegate }() /************************************常用UI 视图**********************************/ /// 全局keywindow static let jsKeywindow: UIWindow? = { var window = UIApplication.shared.keyWindow if window == nil { window = UIApplication.shared.windows.first } return window }() static let jsTabbarController = { return BFTabbarManager.jsAppDelegate.tabBarController }() /// 当前顶部视图控制器 func jsTopViewController() -> UIViewController? { let topView = BFTabbarManager.jsTabbarController?.topViewController() return topView } /// 当前顶部导航栏控制器 func jsTopNavigationViewController() -> UINavigationController? { let nav = BFTabbarManager.jsTabbarController?.currentNavigationViewController() return nav } /// 当前顶部视图 func jsTopView() -> UIView? { let topView = jsTopViewController() return topView?.view } /// 选中tab /// /// - Parameter index: 位置 func goto(index: Int) { BFTabbarManager.jsTabbarController?.gotoTab(index: index) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/BFTimeHelper.swift ================================================ // // BFTimeHelper.swift // BeeFun // // Created by WengHengcong on 2017/3/6. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import SwiftDate class BFTimeHelper: NSObject { static let shared = BFTimeHelper() /// 返回互联网时间 /// /// - Parameters: /// - rare: 原来的字符串 /// - prefix: 时间前缀 /// - Returns: 返回互联网时间 func internetTime(rare: String?, prefix: String?) -> String? { if let rareStr: String = rare { let createAt: Date = rareStr.date(withFormat: DateFormats.iso8601)! var internet = createAt.toString() if prefix != nil { internet = prefix!.localized + " :" + internet } return internet } return nil } /// 返回可读时间 /// /// - Parameters: /// - rare: 原来的时间字符串 /// - prefix: 时间前缀 /// - Returns: 返回可读时间 func readableTime(rare: String?, prefix: String?) -> String? { if let rareStr: String = rare { let createAt: DateInRegion = rareStr.toDate()! var readable = createAt.toRelative() if prefix != nil { readable = prefix!.localized + " :" + readable } return readable } return nil } } extension Date { /// 获取当前 秒级 时间戳 - 10位 var timeStamp: Int { let timeInterval: TimeInterval = self.timeIntervalSince1970 let timeStamp = Int(timeInterval) return timeStamp } /// 获取当前 毫秒级 时间戳 - 13位 var milliStamp: Int64 { let timeInterval: TimeInterval = self.timeIntervalSince1970 let millisecond = CLongLong(round(timeInterval*1000)) return millisecond } /// 获取当前 秒级 时间戳 - 10位 var timeStampString: String { let timeInterval: TimeInterval = self.timeIntervalSince1970 let timeStamp = Int(timeInterval) return "\(timeStamp)" } /// 获取当前 毫秒级 时间戳 - 13位 var milliStampString: String { let timeInterval: TimeInterval = self.timeIntervalSince1970 let millisecond = CLongLong(round(timeInterval*1000)) return "\(millisecond)" } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/JumpManager.swift ================================================ // // JumpManager.swift // BeeFun // // Created by WengHengcong on 2017/3/30. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import TOWebViewController import SafariServices class JumpManager: NSObject { static let shared = JumpManager() /// 跳转到Repos detail页面 /// /// - Parameter repos: 项目model func jumpReposDetailView(repos: ObjRepos?, from: ReposDetailFrom) { if repos != nil && (repos?.name != nil || repos?.url != nil) { //获取该repo的user以及name if let repoName = repos?.name { //1. reponame不为空 //repo name格式为:ueer/reponame let componets = repoName.split("/") if componets.count >= 2 { let owner = ObjUser() owner.login = componets.first repos?.owner = owner repos?.name = componets.last } else if let repoUrl = repos?.url { //repo name格式为:reponame //就去看repo 的url不是空的,分拆 let componets = repoUrl.split("/") if componets.count > 2 { let owner = ObjUser() owner.login = componets[componets.count-2] repos?.owner = owner repos?.name = componets.last } } } else if let repoUrl = repos?.url { //2.reponame为空,repo 的url不为空,分拆 let componets = repoUrl.split("/") if componets.count > 2 { let owner = ObjUser() owner.login = componets[componets.count-2] repos?.owner = owner } } let vc = BFRepoDetailController() vc.hidesBottomBarWhenPushed = true vc.repoModel = repos vc.from = from DispatchQueue.main.async { BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(vc, animated: true) } } } /// 跳转到用户详情页 /// /// - Parameter user: 用户model func jumpUserDetailView(user: ObjUser?) { if user != nil { let vc = BFUserDetailController() vc.hidesBottomBarWhenPushed = true vc.developer = user DispatchQueue.main.async { BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(vc, animated: true) } } } /// 跳转到M页 /// /// - Parameter url: M页地址 func jumpWebView(url: String?) { if url != nil { if let JUMPURL = URL(string: url!) { let web = SFSafariViewController(url: JUMPURL) web.hidesBottomBarWhenPushed = true if #available(iOS 11.0, *) { web.dismissButtonStyle = .close } else { // Fallback on earlier versions } DispatchQueue.main.async { BFTabbarManager.shared.jsTopNavigationViewController()?.present(web, animated: true, completion: { }) } } // let webController = BFWebViewController(urlString: url) // webController?.loadingBarTintColor = UIColor.bfRedColor // if let webview = webController?.webView { // for scrollView in webview.subviews where scrollView.isKind(of: UIScrollView.self) { // let src = scrollView as? UIScrollView // src?.showsHorizontalScrollIndicator = false // src?.bounces = false // } // webview.scalesPageToFit = true // webview.backgroundColor = .clear // webview.isOpaque = false // } // // webController?.hidesBottomBarWhenPushed = true // DispatchQueue.main.async { // BFTabbarManager.shared.jsTopNavigationViewController()?.pushViewController(webController!, animated: true) // } } } /// 跳转到Issue详情页 /// /// - Parameter issue: Issue model func jumpIssueDetailView(issue: ObjIssue?) { if let url = issue?.html_url { jumpWebView(url: url) } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/PlistHelper.swift ================================================ // // PlistHelper.swift // BeeFun // // Created by wenghengcong on 16/1/17. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Foundation enum PHError: Error { case `nil`(String) case nsData(String) case json(String) } public extension Dictionary { /** Load a Plist file from the app bundle into a new dictionary :param: File name :throws: EHError : Nil :return: Dictionary? */ static func readPlist(_ filename: String) throws -> [String: AnyObject] { guard let path = Bundle.appBundle.path(forResource: filename, ofType: "plist") else { throw PHError.nil("[PlistHelper][readPlist] (pathForResource) The file could not be located\nFile : '\(filename).plist'") } guard let plistDict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] else { throw PHError.nil("[PlistHelper][readPlist] (NSDictionary) There is a file error or if the contents of the file are an invalid representation of a dictionary. File : '\(filename)'.plist") } return plistDict } } public extension Array { /** Load a Plist file from the app bundle into a new array :param: File name :throws: EHError : Nil :return: Dictionary? */ static func readPlist(_ filename: String) throws -> [String : AnyObject] { guard let path = Bundle.appBundle.path(forResource: filename, ofType: "plist") else { throw PHError.nil("[EasyHelper][readPList] (pathForResource) The file could not be located\nFile : '\(filename).plist'") } guard let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject] else { throw PHError.nil("[EasyHelper][readPList] (NSDictionary) There is a file error or if the contents of the file are an invalid representation of a dictionary. File : '\(filename)'.plist") } return plistDict } } class PlistHelper: NSObject { } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/Utils/UserManager.swift ================================================ // // UserManager.swift // BeeFun // // Created by wenghengcong on 16/1/16. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import ObjectMapper import SwiftMessages import Crashlytics class UserManager: NSObject { static let shared = UserManager() override init() { super.init() if isLogin { //去请求一次用户数据 let provider = Provider.sharedProvider provider.request(.myInfo) { (result) -> Void in switch result { case let .success(response): do { if let gitUser: ObjUser = Mapper().map(JSONObject: try response.mapJSON()) { if gitUser.login != nil { self.user = gitUser self.setCrashlytics() } } else { } } catch { } case .failure: break } } } } /// 初始化Crashlytics参数 func setCrashlytics() { if let username = self.user?.name { Crashlytics.sharedInstance().setUserName(username) } if let email = self.user?.email { Crashlytics.sharedInstance().setUserEmail(email) } if let login = self.user?.login { Crashlytics.sharedInstance().setUserIdentifier(login) } AnswerManager.logLogin(method: "AutoLogin", success: true, attributes: [:]) } /// 用户对象 var user: ObjUser? { get { let user: ObjUser? = ObjUser.loadUserInfo() return user } set(newUser) { ObjUser.saveUserInfo(newUser) } } /// 是否登录,不作登录操作 var isLogin: Bool { if user != nil { if ((user!.login) != nil) && !((user!.login!).isEmpty) && (AppToken().access_token != nil) { return true } } return false } /// 判断用户类型 var isUser: Bool { if isLogin && ( (user!.type!) == "User") { return true } return false } /// 用户名,可能不唯一,也有可能为空 var name: String? { return user?.name } /// 登录名,唯一,目前看来,不为空 var login: String? { return user?.login } /// user token var userToken: String { get { return AppToken().access_token! } set(newtoken) { let token = AppToken.shared token.access_token = newtoken user?.token = newtoken } } var rewardSwitch: Bool = false /// 重载用户对象 func reloadUser() { self.user = ObjUser.loadUserInfo() } /// 保存用户对象 func saveUser(user: ObjUser) { ObjUser.saveUserInfo(user) self.reloadUser() } /// 删除用户对象 func deleteUser() { ObjUser.deleteUserInfo() self.reloadUser() } /// 用户登录 func userSignIn() { OAuthManager.shared.beginOauth() } /// 用户登出 func userSignOut() { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.WillLogout, object: nil) BFNetworkManager.clearCache() BFNetworkManager.clearCookies() UserManager.shared.deleteUser() AppToken.shared.clear() NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DidLogout, object: nil) } /// 检查是否登录,未登录时,弹出提示 /// func checkUserLogin() -> Bool { if isLogin { //已登录,返回true return true } else { //未登录,显示提示 showNotLoginTips() return false } } /// 未登录需要提醒 func needLoginAlert() -> Bool { return checkUserLogin() } /// 需要登录,未登录弹出登录页面 /// func needLogin() -> Bool { if isLogin { //已登录,返回true return true } else { //未登录,弹出登录界面 self.userSignIn() return false } } /// 显示登录tip fileprivate func showNotLoginTips() { let status = MessageView.viewFromNib(layout: .messageView) status.configureContent(title: "Sign in Now?".localized, body: "access data ask github account".localized, iconImage: nil, iconText: nil, buttonImage: nil, buttonTitle: "Sign in".localized, buttonTapHandler: { _ in SwiftMessages.hide() self.userSignIn() }) status.configureTheme(.error) status.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) status.bodyLabel?.font = UIFont.bfSystemFont(ofSize: 12.0) status.button?.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) // var statusConfig = SwiftMessages.defaultConfig // statusConfig.presentationStyle = .top // statusConfig.duration = .seconds(seconds: 1.0) // SwiftMessages.show(config: statusConfig, view: status) SwiftMessages.show(view: status) } /// 更新User(BeeFun) func updateUserInfo() { if !UserManager.shared.isLogin { return } if let user = UserManager.shared.user { user.token = AppToken.shared.access_token BeeFunProvider.sharedProvider.request(BeeFunAPI.addUser(user: user)) { (result) in switch result { case let .success(response): do { if let userResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) { if let code = userResponse.codeEnum, code == BFStatusCode.bfOk { } } } catch { } case .failure: break } } } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/View/MJRefreshManager.swift ================================================ // // MJRefreshManager.swift // BeeFun // // Created by WengHengcong on 2017/4/13. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import MJRefresh protocol MJRefreshManagerAction: class { func headerRefresh() func footerRefresh() } class MJRefreshManager: NSObject { weak var delegate: MJRefreshManagerAction? override init() { super.init() } /// 头部刷新控件 /// /// - Returns: <#return value description#> func header() -> MJRefreshNormalHeader { let header = MJRefreshNormalHeader() header.lastUpdatedTimeLabel.isHidden = true header.stateLabel.isHidden = true // header.setTitle(kHeaderIdelTIP.localized, for: .idle) // header.setTitle(kHeaderPullTip, for: .pulling) // header.setTitle(kHeaderPullingTip, for: .refreshing) header.setRefreshingTarget(self, refreshingAction:#selector(mj_headerRefresh)) return header } /// 头部刷新控件 /// /// - Parameters: /// - target: <#target description#> /// - action: 刷新回调方法 /// - Returns: <#return value description#> func header(_ target: Any!, refreshingAction action: Selector!) -> MJRefreshNormalHeader { let header = MJRefreshNormalHeader() header.lastUpdatedTimeLabel.isHidden = true header.stateLabel.isHidden = true // header.setTitle(kHeaderIdelTIP, for: .idle) // header.setTitle(kHeaderPullTip, for: .pulling) // header.setTitle(kHeaderPullingTip, for: .refreshing) header.setRefreshingTarget(target, refreshingAction:action) return header } /// 内部代理方法 @objc func mj_headerRefresh() { if self.delegate != nil { self.delegate?.headerRefresh() } } /// 底部加载控件 /// /// - Returns: <#return value description#> func footer() -> MJRefreshAutoNormalFooter { let footer = MJRefreshAutoNormalFooter() // footer.isAutomaticallyHidden = true // footer.setTitle(kFooterIdleTip, for: .idle) // footer.setTitle(kFooterLoadTip, for: .refreshing) // footer.setTitle(kFooterLoadNoDataTip, for: .noMoreData) footer.setRefreshingTarget(self, refreshingAction:#selector(mj_footerRefresh)) footer.stateLabel.isHidden = true footer.isRefreshingTitleHidden = true return footer } /// 底部加载控件 /// /// - Parameters: /// - target: <#target description#> /// - action: 加载回调方法 /// - Returns: <#return value description#> func footer(_ target: Any!, refreshingAction action: Selector!) -> MJRefreshAutoNormalFooter { let footer = MJRefreshAutoNormalFooter() // footer.setTitle(kFooterIdleTip, for: .idle) // footer.setTitle(kFooterLoadTip, for: .refreshing) // footer.setTitle(kFooterLoadNoDataTip, for: .noMoreData) footer.setRefreshingTarget(target, refreshingAction:action) footer.stateLabel.isHidden = true footer.isRefreshingTitleHidden = true return footer } /// 内部代理方法 @objc func mj_footerRefresh() { if self.delegate != nil { self.delegate?.footerRefresh() } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/View/YYTextManager.swift ================================================ // // YYTextManager.swift // BeeFun // // Created by WengHengcong on 16/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText class YYTextManager: NSObject { class func enableDebug() { let debugOption = YYTextDebugOption() debugOption.baselineColor = UIColor.red debugOption.ctFrameFillColor = UIColor.red debugOption.ctLineFillColor = UIColor(red: 0.000, green: 0.463, blue: 1.000, alpha: 0.180) debugOption.cgGlyphBorderColor = UIColor(red: 1.000, green: 0.524, blue: 0.000, alpha: 0.200) YYTextDebugOption.setShared(debugOption) } class func addLineBreakCharacterAttribute(orginal: NSAttributedString?) -> NSMutableAttributedString { if orginal == nil { return self.newLineCharacterAttribute() } let mutable = NSMutableAttributedString(attributedString: orginal!) mutable.append(self.newLineCharacterAttribute()) return mutable } /// 换行符属性文本 class func newLineCharacterAttribute() -> NSMutableAttributedString { return NSMutableAttributedString(string: "\n") } class func addBlankSpaceCharacterAttribute(orginal: NSAttributedString?, count: Int) -> NSMutableAttributedString { if orginal == nil { return self.newLineCharacterAttribute() } let mutable = NSMutableAttributedString(attributedString: orginal!) mutable.append(self.blankSpaceCharacterAttribute(count: count)) return mutable } /// 空白字符 /// /// - Parameter count: <#count description#> /// - Returns: <#return value description#> class func blankSpaceCharacterAttribute(count: Int) -> NSMutableAttributedString { let blank = String(repeating: " ", count: count) return NSMutableAttributedString(string: blank) } class func moreDotCharacterAttribute(count: Int) -> NSMutableAttributedString { let blank = String(repeating: ".", count: count) return NSMutableAttributedString(string: blank) } } extension NSMutableAttributedString { /// 增加换行符 func addLineBreakCharacterAttribute() { append(YYTextManager.newLineCharacterAttribute()) } /// 增加空白字符 /// /// - Parameter count: 空白字符的个数 func addBlankSpaceCharacterAttribute(_ count: Int) { append(YYTextManager.blankSpaceCharacterAttribute(count: count)) } /// 增加.符号 /// /// - Parameter count: <#count description#> func addMoreDotCharacterAttribute(_ count: Int) { append(YYTextManager.moreDotCharacterAttribute(count: count)) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/iCloud/BFPathManager.swift ================================================ // // BFPathManager.swift // BeeFunMac // // Created by WengHengcong on 2017/12/4. // Copyright © 2017年 LuCi. All rights reserved. // import Foundation class BFPathManager: NSObject { static let shared = BFPathManager() #if DEBUG var zipFileName = "github_debug.zip" #else var zipFileName = "github.zip" #endif // MARK: - For zip /// Zip 本地路径 /// ...../github.zip func localZipFilePath() -> URL? { return BFPathManager.shared.localDocumentURL(fileName: zipFileName) } /// Zip iCloud路径 /// ...../github.zip func iCloudZipFilePath() -> URL? { return BFPathManager.shared.iCloudDocumentURL(fileName: zipFileName) } /// 需要压缩的路径 /// .../..../github.sqlite func needZipFilePath() -> URL? { return BFPathManager.shared.localDocumentURL(fileName: SQLManager.githubDatabaseName) } /// 需要解压缩的路径 /// .../....com.beefun.mac./ func unZipFilePath() -> URL? { return BFPathManager.shared.localDocumentURL() } // MARK: - Local Path func localDocumentURL(fileName: String) -> URL? { let docUrl = localDocumentURL() var fileUrl = docUrl?.appendingPathComponent(fileName) if let urlString = fileUrl?.absoluteString, urlString.lastCharacter == "/" { let nweUrlString = urlString.substring(to: urlString.length-1) fileUrl = URL.init(string: nweUrlString) } return fileUrl } func localDocumentURL() -> URL? { let fm = FileManager.default let urlPaths = fm.urls(for: .documentDirectory, in: .userDomainMask) var userDocumentDirectory = URL(string: "") if let appDirectory = urlPaths.last { userDocumentDirectory = appDirectory if !fm.fileExists(atPath: appDirectory.path) { do { try fm.createDirectory(at: appDirectory, withIntermediateDirectories: false, attributes: nil) } catch { } } } return userDocumentDirectory } // MARK: - iCloud Path /// iCloud.../Document/fileName func iCloudDocumentURL(fileName: String) -> URL? { return iCloudDocumentURL(nil, fileName: fileName) } func iCloudDocumentURL(_ containerId: String?, fileName: String) -> URL? { if containerId != nil { if let url = FileManager.default.url(forUbiquityContainerIdentifier: containerId) { return url.appendingPathComponent("Documents").appendingPathComponent(fileName) } } else { if let url = FileManager.default.url(forUbiquityContainerIdentifier: nil) { return url.appendingPathComponent("Documents").appendingPathComponent(fileName) } } return nil } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Manager/iCloud/BFZipManager.swift ================================================ // // BFZipManager.swift // BeeFun // // Created by WengHengcong on 2018/1/25. // Copyright © 2018年 LuCi. All rights reserved. // /* import Zip class BFZipManager: NSObject { static let shared = BFZipManager() func zipDB() -> Bool { do { if let needZipFile = BFPathManager.shared.needZipFilePath(), let zipFile = BFPathManager.shared.localZipFilePath() { try Zip.zipFiles(paths: [needZipFile], zipFilePath: zipFile, password: nil, compression: .BestCompression, progress: { (progress) in print("zip file progress: \(progress)") }) print("zip file path \(needZipFile)") return true } } catch { print("zip db file went wrong") SQLManager.checkDBValid() } return false } func unZipDB() -> Bool { do { if let unZipFile = BFPathManager.shared.localZipFilePath() ,let des = BFPathManager.shared.unZipFilePath() { try Zip.unzipFile(unZipFile, destination: des, overwrite: true, password: nil, progress: { (progress) -> () in print("unzip file progress: \(progress)") }) return true } } catch { print("unzip db file went wrong") //解压缩错误,就要检查是否有github.sqlite数据库,无就要创建 SQLManager.checkDBValid() } return false } } */ ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/BFNetworkManager.swift ================================================ // // BFNetworkManager.swift // BeeFun // // Created by wenghengcong on 16/1/10. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import WebKit import Reachability class BFNetworkManager: NSObject { static let shared = BFNetworkManager() var lastState: Reachability.Connection = .none let reachabilityManager = Reachability()! var isReachable: Bool { lastState = reachabilityManager.connection return reachabilityManager.connection != .none } var isReachableOnCellular: Bool { lastState = reachabilityManager.connection return reachabilityManager.connection == .cellular } var isReachableOnWiFi: Bool { lastState = reachabilityManager.connection return reachabilityManager.connection == .wifi } func startListening() { reachabilityManager.whenReachable = { reachability in if reachability.connection == .wifi { print("The network is reachable via WiFi: \(self.reachabilityManager.connection)") NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableWiFi, object: nil) } else { print("The network is reachable via Cellular: \(self.reachabilityManager.connection)") NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableCellular, object: nil) } if self.lastState == .none && (reachability.connection == .wifi || reachability.connection == .cellular) { print("The network is reachable after unreachable: \(self.reachabilityManager.connection)") NotificationCenter.default.post(name: NSNotification.Name.BeeFun.ReachableAfterUnreachable, object: nil) } self.lastState = reachability.connection } reachabilityManager.whenUnreachable = { reachability in print("The network is not reachable: \(self.reachabilityManager.connection)") NotificationCenter.default.post(name: NSNotification.Name.BeeFun.NotReachable, object: nil) if (self.lastState == .wifi || self.lastState == .cellular) && reachability.connection == .none { print("The network is not reachable after reachable: \(self.reachabilityManager.connection)") NotificationCenter.default.post(name: NSNotification.Name.BeeFun.UnReachableAfterReachable, object: nil) } self.lastState = reachability.connection } do { try reachabilityManager.startNotifier() } catch { print("Unable to start notifier") } } func stopListening() { lastState = .none reachabilityManager.stopNotifier() } // MARK: - 清除工具 /// 清除Cookies class func clearCookies() { let storage: HTTPCookieStorage = HTTPCookieStorage.shared for cookie in storage.cookies! { storage.deleteCookie(cookie) } } /// 清除缓存 class func clearCache() { if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache, WKWebsiteDataTypeOfflineWebApplicationCache, WKWebsiteDataTypeCookies, WKWebsiteDataTypeSessionStorage, WKWebsiteDataTypeLocalStorage]) let date = NSDate(timeIntervalSince1970: 0) WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes as! Set, modifiedSince: date as Date, completionHandler: { }) } else { var libraryPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, false).first! libraryPath += "/Cookies" do { try FileManager.default.removeItem(atPath: libraryPath) } catch { print("error") } URLCache.shared.removeAllCachedResponses() } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/BFStatusCode.swift ================================================ // // BFResponseStatusCode.swift // BeeFun // // Created by WengHengcong on 2018/5/5. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit public enum BFStatusCode: Int { case bfOk = 0 // Informational case `continue` = 100 case switchingProtocols = 101 case processing = 102 // Success case ok = 200 case created = 201 case accepted = 202 case nonAuthoritativeInformation = 203 case noContent = 204 case resetContent = 205 case partialContent = 206 case multiStatus = 207 case alreadyReported = 208 case imUsed = 226 // Redirections case multipleChoices = 300 case movedPermanently = 301 case found = 302 case seeOther = 303 case notModified = 304 case useProxy = 305 case switchProxy = 306 case temporaryRedirect = 307 case permanentRedirect = 308 // Client Errors case badRequest = 400 case unauthorized = 401 case paymentRequired = 402 case forbidden = 403 case notFound = 404 case methodNotAllowed = 405 case notAcceptable = 406 case proxyAuthenticationRequired = 407 case requestTimeout = 408 case conflict = 409 case gone = 410 case lengthRequired = 411 case preconditionFailed = 412 case requestEntityTooLarge = 413 case requestURITooLong = 414 case unsupportedMediaType = 415 case requestedRangeNotSatisfiable = 416 case expectationFailed = 417 case imATeapot = 418 case authenticationTimeout = 419 case unprocessableEntity = 422 case locked = 423 case failedDependency = 424 case upgradeRequired = 426 case preconditionRequired = 428 case tooManyRequests = 429 case requestHeaderFieldsTooLarge = 431 case loginTimeout = 440 case noResponse = 444 case retryWith = 449 case unavailableForLegalReasons = 451 case requestHeaderTooLarge = 494 case certError = 495 case noCert = 496 case httpToHTTPS = 497 case tokenExpired = 498 case clientClosedRequest = 499 // Server Errors case internalServerError = 500 case notImplemented = 501 case badGateway = 502 case serviceUnavailable = 503 case gatewayTimeout = 504 case httpVersionNotSupported = 505 case variantAlsoNegotiates = 506 case insufficientStorage = 507 case loopDetected = 508 case bandwidthLimitExceeded = 509 case notExtended = 510 case networkAuthenticationRequired = 511 case networkTimeoutError = 599 //以下是BeeFun api特俗定义的 case addTagWhenExist = 1102 } public extension BFStatusCode { /// Informational - Request received, continuing process. public var isInformational: Bool { return inRange( (100...199) ) } /// Success - The action was successfully received, understood, and accepted. public var isSuccess: Bool { return inRange( (200...299) ) } /// Redirection - Further action must be taken in order to complete the request. public var isRedirection: Bool { return inRange( (300...399) ) } /// Client Error - The request contains bad syntax or cannot be fulfilled. public var isClientError: Bool { return inRange(400...499) } /// Server Error - The server failed to fulfill an apparently valid request. public var isServerError: Bool { return inRange(500...599) } /// - returns: `true` if the status code is in the provided range, false otherwise. //see http://stackoverflow.com/questions/25308978/what-are-intervals-in-swift-ranges fileprivate func inRange(_ range: ClosedRange) -> Bool { return range.contains(rawValue) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/BeeFunAPI.swift ================================================ // // BeeFunAPI.swift // BeeFun // // Created by WengHengcong on 2018/4/22. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import Foundation import Moya import Alamofire import ObjectMapper class InsideBeeFunProvider: MoyaProvider where Target: TargetType { override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) { super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights) } } struct BeeFunProvider { fileprivate static var endpointsClosure = { (target: BeeFunAPI) -> Endpoint in var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) return endpoint } static func stubBehaviour(_: BeeFunAPI) -> Moya.StubBehavior { return .never } static func DefaultProvider() -> InsideBeeFunProvider { return InsideBeeFunProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false) } fileprivate struct SharedProvider { static var instance = BeeFunProvider.DefaultProvider() } static var sharedProvider: InsideBeeFunProvider { get { return SharedProvider.instance } set (newSharedProvider) { SharedProvider.instance = newSharedProvider } } } public enum BeeFunAPI { //更新数据库 //1. 每次启动时 2. case updateServerDB(first: Bool, update: Bool) // User case addUser(user: ObjUser) //从BeeFun获取到github starrd 的页数,每页100 case repoPage(owner: String) case repos(tag: String, language: String, page: Int, perpage: Int, sort: String, direction: String) case delRepo(repoid: Int) case addRepo(repo: ObjRepos) //tag // MARK: - page或perpage传0,就返回所有数据 case getAllTags(filter: [String: Any]) case getTag(name: String) case addTag(tagModel: ObjTag) case addTagToRepo(change:Bool, star_tags: String, delete_tags:[String], repoId: Int) case updateTag(name: String, to: String) case deleteTag(name: String) //language case getLanguages(page:Int, perpage:Int, sort:String, direction:String) // MARK: - Tringding case getGithubTrending(model: BFGithubTrendingRequsetModel) } extension BeeFunAPI: TargetType { public var headers: [String: String]? { let token = AppToken.shared.access_token ?? "" let owner = UserManager.shared.login ?? "" var header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner] switch self { case .addUser(_): header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner, "Content-Type": "application/json"] return header case .addTag(_): header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner, "Content-Type": "application/json"] return header default: header = ["User-Agent": "BeeFuniOS", "Authorization": token, "timeoutInterval": "15.0", "owner": owner] return header } } public var parameterEncoding: ParameterEncoding { return Alamofire.ParameterEncoding.self as! ParameterEncoding } public var baseURL: URL { switch self { default: //Check list: 修改上线环境及证书 // beefun.top 已经下线 return URL(string: "https://www.beefun.top:8082/beefun")! //远程环境 // return URL(string: "http://localhost:8082")! //本地测试环境 } } public var path: String { switch self { case .addRepo(_): return "/v1/repo/client" case .updateServerDB(_, _): return "/v1/db/update" case .addUser(_): return "/v1/user" case .repoPage(let owner): return "/v1/reponum/\(owner)" case .repos(let tag, _, _, _, _, _): return "/v1/repos/\(tag)" case .delRepo(let repoid): return "/v1/repo/\(repoid)" case .getGithubTrending(_): return "/v1/explore/trending" // tag操作 case .getAllTags(_): return "/v2/tags" case .getTag(let name): return "/v1/tag/\(name)" case .addTag(_): return "/v1/tag" case .addTagToRepo(_, _, _, let repoId): return "/v1/repo/tag/\(repoId)" case .updateTag(let name, _): return "/v1/tag/\(name)" case .deleteTag(let name): return "/v1/tag/\(name)" case .getLanguages(_, _, _, _): return "/v1/lans" } } public var method: Moya.Method { switch self { case .addUser(_): return .post case .addRepo(_): return .post case .addTag(_): return .post case .updateTag(_, _): return .put case .deleteTag(_): return .delete case .addTagToRepo(_, _,_, _): return .post case .delRepo(_): return .delete default: return .get } } public var parameters: [String: Any]? { switch self { case .updateServerDB(let first, let update): return [ "first": first as AnyObject, "update": update as AnyObject ] case .addUser(let user): return user.toJSON() case .addRepo(let repo): return repo.toJSON() case .getGithubTrending(let model): return model.toJSON() case .getAllTags(let filter): return filter case .updateTag(_, let to): return [ "to": to ] case .addTag(let tagModel): return tagModel.toJSON() case .addTagToRepo(let change, let star_tags, let delete_tags, _): return [ "change": change, "star_tags": star_tags, "del_tags": delete_tags ] case .repos(_,let language, let page, let perpage, let sort, let direction): return [ "source" : 0, "language": language as AnyObject, "page": page as AnyObject, "perpage": perpage as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .getLanguages(let page, let perpage, let sort, let direction): return [ "page": page as AnyObject, "perpage": perpage as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] default: return nil } } public var task: Task { let encoding: ParameterEncoding switch self.method { case .post: encoding = JSONEncoding.default default: encoding = URLEncoding.default } if let requestParameters = parameters { return .requestParameters(parameters: requestParameters, encoding: encoding) } return .requestPlain } //Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self. public var sampleData: Data { switch self { default : return "default".data(using: String.Encoding.utf8)! } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/BeeFunDBManager.swift ================================================ // // BeeFunDBManager.swift // BeeFun // // Created by WengHengcong on 2018/5/14. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BeeFunDBManager: NSObject { static let shared = BeeFunDBManager() var lastTimeStampKey = "lastUpdateFromGithub" func updateServerDB(showTips: Bool, first: Bool) { if !UserManager.shared.needLoginAlert() { return } if showTips { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.SyncStarRepoStart, object: nil) } let nowDate = Date().timeStamp let lastUpdate = UserDefaults.standard.integer(forKey: lastTimeStampKey) if (nowDate - lastUpdate > 1 * 24 * 60 * 60) || first { updateRequest(showTips: showTips, first: first, update: true) } else { updateRequest(showTips: showTips, first: first, update: false) } } /// 更新请求 /// /// - Parameter update: 是否更新所有已经在server db存在repo的信息 func updateRequest(showTips: Bool, first: Bool, update: Bool) { BeeFunProvider.sharedProvider.request(BeeFunAPI.updateServerDB(first: first, update: update)) { (result) in switch result { case let .success(response): do { if let tagResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum, code == BFStatusCode.bfOk { if showTips { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.SyncStarRepoEnd, object: nil) } if update { //添加成功 UserDefaults.standard.set(Date().timeStamp, forKey: self.lastTimeStampKey) } } } } catch { } case .failure: break } } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/EventAPI.swift ================================================ // // EventAPI.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import Foundation import Moya import Alamofire import ObjectMapper class InsideEventProvider: MoyaProvider where Target: TargetType { override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) { super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights) } } struct EventProvider { fileprivate static var endpointsClosure = { (target: EventAPI) -> Endpoint in // Sign all non-XApp token requests var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) return endpoint } static func stubBehaviour(_: EventAPI) -> Moya.StubBehavior { return .never } static func DefaultProvider() -> InsideEventProvider { return InsideEventProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false) } fileprivate struct SharedProvider { static var instance = EventProvider.DefaultProvider() } static var sharedProvider: InsideEventProvider { get { return SharedProvider.instance } set (newSharedProvider) { SharedProvider.instance = newSharedProvider } } } /// Event API /// /// - publicEvents: List public events /// - repoEvents: List repository events /// - repoIssueEvents: List issue events for a repository,Repository issue events have a different format than other events, as documented in the Issue Events API(https://developer.github.com/v3/issues/events/). /// - repoPublicNetworkEvents: List public events for a network of repositories /// - orgPublicEvent: List public events for an organization /// - userReceivedEvents: List events that a user has received,These are events that you've received by watching repos and following users. If you are authenticated as the given user, you will see private events. Otherwise, you'll only see public events. /// - userReceivedPublicEvents: List public events that a user has received /// - userEvents: List events performed by a user. If you are authenticated as the given user, you will see your private events. Otherwise, you'll only see public events. /// - userPublicEvents: List public events performed by a user /// - orgEvents: List events for an organization public enum EventAPI { case publicEvents(page:Int, perpage:Int) case repoEvents(owner:String, repo:String, page:Int, perpage:Int) case repoIssueEvents(owner:String, repo:String, page:Int, perpage:Int) case repoPublicNetworkEvents(owner:String, repo:String, page:Int, perpage:Int) case orgPublicEvent(organization:String, page:Int, perpage:Int) case userReceivedEvents(username:String, page:Int, perpage:Int) case userReceivedPublicEvents(username:String, page:Int, perpage:Int) case userEvents(username:String, page:Int, perpage:Int) case userPublicEvents(username:String, page:Int, perpage:Int) case orgEvents(username:String, organization:String, page:Int, perpage:Int) } extension EventAPI: TargetType { public var headers: [String : String]? { var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"] switch self { default: header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"] return header } } public var parameterEncoding: ParameterEncoding { return (Alamofire.ParameterEncoding.self as? ParameterEncoding)! } public var baseURL: URL { switch self { default: return URL(string: "https://api.github.com")! } } public var path: String { switch self { //Event case .publicEvents: return "/events" case .repoEvents(let owner, let repo, _, _): return "/repos/\(owner)/\(repo)/events" case .repoIssueEvents(let owner, let repo, _, _): return "/repos/\(owner)/\(repo)/issues/events" case .repoPublicNetworkEvents(let owner, let repo, _, _): return "/networks/\(owner)/\(repo)/events" case .orgPublicEvent(let organization, _, _): return "/orgs/\(organization)/events" case .userReceivedEvents(let username, _, _): return "/users/\(username)/received_events" case .userReceivedPublicEvents(let username, _, _): return "/users/\(username)/received_events/public" case .userEvents(let username, _, _): return "/users/\(username)/events" case .userPublicEvents(let username, _, _): return "/users/\(username)/events/public" case .orgEvents(let username, let organization, _, _): return "/users/\(username)/events/orgs/\(organization)" } } public var method: Moya.Method { switch self { default: return .get } } public var parameters: [String: Any]? { switch self { //Event case .publicEvents(let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .repoEvents(_, _, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .repoIssueEvents(_, _, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .repoPublicNetworkEvents(_, _, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .orgPublicEvent(_, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userReceivedEvents(_, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userReceivedPublicEvents(_, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userEvents(_, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userPublicEvents(_, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .orgEvents(_, _, let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] } } public var task: Task { let encoding: ParameterEncoding switch self.method { case .post: encoding = JSONEncoding.default default: encoding = URLEncoding.default } if let requestParameters = parameters { return .requestParameters(parameters: requestParameters, encoding: encoding) } return .requestPlain } //Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self. public var sampleData: Data { switch self { default : return "default".data(using: String.Encoding.utf8)! } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/GitHubAPI.swift ================================================ // // GitV3API.swift // BeeFun // // Created by wenghengcong on 16/1/10. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Foundation import Moya import Alamofire import ObjectMapper typealias SuccessClosure = (_ result: AnyObject) -> Void //typealias SuccessClosure = (result: Mappable) -> Void typealias FailClosure = (_ errorMsg: String?) -> Void // MARK: - Provider setup class GitHupPorvider: MoyaProvider where Target: TargetType { override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) { super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights) } } struct Provider { fileprivate static var endpointsClosure = { (target: GitHubAPI) -> Endpoint in var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) return endpoint } static func stubBehaviour(_: GitHubAPI) -> Moya.StubBehavior { return .never } static func DefaultProvider() -> GitHupPorvider { return GitHupPorvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false) } fileprivate struct SharedProvider { static var instance = Provider.DefaultProvider() } static var sharedProvider: GitHupPorvider { get { return SharedProvider.instance } set (newSharedProvider) { SharedProvider.instance = newSharedProvider } } } struct APIKeyName { static let sortKey = "sort" static let dirctionKey = "direction" } public enum GitHubAPI { //url case gerUrl(url:String) case postUrl(url:String) case headtUrl(url:String) case putUrl(url:String) case patchUrl(url:String) case deleteUrl(url:String) case traceUrl(url:String) case connectUrl(url:String) //user case myInfo case userInfo(username:String) case updateUserInfo(name:String, email:String, blog:String, company:String, location:String, hireable:Bool, bio:String) case allUsers(page:Int, perpage:Int) //user email case userEmails case addEmail case delEmail //user followers case userFollowers(page:Int, perpage:Int, username:String) case myFollowers case userFollowing(page:Int, perpage:Int, username:String) case myFollowing case checkUserFollowing(username:String) case checkFollowing(username:String, target_user:String) case follow(username:String) case unfollow(username:String) //repository case myRepos(page:Int, perpage:Int, type:String, sort:String, direction:String) case userRepos( username:String, page:Int, perpage:Int, type:String, sort:String, direction:String) case orgRepos(type:String, organization:String) case pubRepos(page:Int, perpage:Int) case userSomeRepo(owner:String, repo:String) //starring case reposStargazers(owner:String, repo:String) case userStarredRepos(username:String, sort:String, direction:String) case myStarredRepos(page:Int, perpage:Int, sort:String, direction:String) case allMyStarredRepos(sort:String, direction:String) case checkStarred(owner:String, repo:String) case starRepo(owner:String, repo:String) case unstarRepo(owner:String, repo:String) //notification // case MyNotifications(page:Int,perpage:Int,all:Bool ,participating:Bool,since:String,before:String) case myNotifications(page:Int, perpage:Int, all:String, participating:String) case repoNotifications(owner:String, repo:String, all:String, participating:String) case markNotificationsAsRead(last_read_at:String) case markRepoNotificationsAsRead(owner:String, repo:String, last_read_at:String) //watching case repoWatchers(page:Int, perpage:Int, owner:String, repo:String) case userWatchedRepos(page:Int, perpage:Int, username:String) case myWatchedRepos(page:Int, perpage:Int) case checkWatched(owner:String, repo:String) case watchingRepo(owner:String, repo:String, subscribed:String, ignored:String) case unWatchingRepo(owner:String, repo:String) //forks case userReposForks(page:Int, perpage:Int, sort:String, owner:String, repo:String) case createFork(owner:String, repo:String) //gist } extension GitHubAPI: TargetType { public var headers: [String : String]? { var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"] switch self { case .reposStargazers( _, _): return header case .myStarredRepos: return header case .allMyStarredRepos: return header case .userStarredRepos(_ , _, _): return header case .checkStarred( _, _): return header case .starRepo( _, _): return header case .unstarRepo( _, _): return header default: header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"] return header } } public var parameterEncoding: ParameterEncoding { return Alamofire.ParameterEncoding.self as! ParameterEncoding } public var baseURL: URL { switch self { default: return URL(string: "https://api.github.com")! } } public var path: String { switch self { //url case .gerUrl(let url): return url case .postUrl(let url): return url case .headtUrl(let url): return url case .putUrl(let url): return url case .patchUrl(let url): return url case .deleteUrl(let url): return url case .traceUrl(let url): return url case .connectUrl(let url): return url //user case .myInfo: return "/user" case .userInfo(let username): return "/users/\(username)" case .updateUserInfo: return "/user" case .allUsers(_, _): return "/users" //user email case .userEmails: return "/user/emails" case .addEmail: return "/user/emails" case .delEmail: return "/user/emails" //user followers case .userFollowers(_, _, let username): return "/users/\(username)/followers" case .myFollowers: return "/users/followers" case .userFollowing(_, _, let username): return "/users/\(username)/following" case .myFollowing: return "/users/following" case .checkUserFollowing(let username): return "/user/following/\(username)" case .checkFollowing(let username, let target_user): return "/users/\(username)/following/\(target_user)" case .follow(let username): return "/user/following/\(username)" case .unfollow(let username): return "/user/following/\(username)" case .myRepos: return "/user/repos" case .userRepos(let username, _, _, _, _, _): return "/users/\(username)/repos" case .orgRepos(_, let organization): return "/orgs/\(organization)/repos" case .pubRepos: return "/repositories" case .userSomeRepo(let owner, let repo): return "/repos/\(owner)/\(repo)" //starring case .reposStargazers(let owner, let repo): return "/repos/\(owner)/\(repo)/stargazers" case .myStarredRepos: return "/user/starred" case .allMyStarredRepos: return "/user/starred" case .userStarredRepos(let username, _, _): return "/users/\(username)/starred" case .checkStarred(let owner, let repo): return "/user/starred/\(owner)/\(repo)" case .starRepo(let owner, let repo): return "/user/starred/\(owner)/\(repo)" case .unstarRepo(let owner, let repo): return "/user/starred/\(owner)/\(repo)" //notification case .myNotifications: return "/notifications" case .repoNotifications(let owner, let repo, _, _): return "/repos/\(owner)/\(repo)/notifications" case .markNotificationsAsRead: return "/notifications" case .markRepoNotificationsAsRead(let owner, let repo, _): return "/repos/\(owner)/\(repo)/notifications" //watching case .repoWatchers(_, _, let owner, let repo): return "/repos/\(owner)/\(repo)/subscribers" case .userWatchedRepos(_, _, let username): return "/users/\(username)/subscriptions" case .myWatchedRepos: return "/user/subscriptions" case .checkWatched(let owner, let repo): return "/repos/\(owner)/\(repo)/subscription" case .watchingRepo(let owner, let repo, _, _): return "/user/subscriptions/\(owner)/\(repo)" case .unWatchingRepo(let owner, let repo): return "/repos/\(owner)/\(repo)/subscription" //forks case .userReposForks(_, _, _, let owner, let repo): return "/repos/\(owner)/\(repo)/forks" case .createFork(let owner, let repo): return "/repos/\(owner)/\(repo)/forks" } } public var method: Moya.Method { switch self { //url case .gerUrl: return .get case .postUrl: return .post case .headtUrl: return .head case .putUrl: return .put case .patchUrl: return .patch case .deleteUrl: return .delete case .traceUrl: return .trace case .connectUrl: return .connect case .updateUserInfo: return .patch //user email case .addEmail: return .post case .delEmail: return .delete //user followers case .follow(_): return .put case .unfollow(_): return .delete //starring case .starRepo(_, _): return .put case .unstarRepo(_, _): return .delete case .markRepoNotificationsAsRead: return .put case .markNotificationsAsRead: return .put //watching case .watchingRepo: return .put case .unWatchingRepo: return .delete case .createFork: return .post default: return .get } } public var parameters: [String: Any]? { switch self { //follower case .userFollowers(let page, let perpage, _): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userFollowing(let page, let perpage, _): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .updateUserInfo(let name, let email, let blog, let company, let location, let hireable, let bio): return [ "name": name as AnyObject, "email": email as AnyObject, "blog": blog as AnyObject, "company": company as AnyObject, "location": location as AnyObject, "hireable": hireable as AnyObject, "bio": bio as AnyObject ] case .allUsers(let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .myRepos(let page, let perpage, let type, let sort, let direction): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "type": type as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .userRepos(_, let page, let perpage, let type, let sort, let direction): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "type": type as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .orgRepos(let type, _): return [ "type": type as AnyObject ] case .pubRepos(let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] //starring case .userStarredRepos(_, let sort, let direction): return [ "sort": sort as AnyObject, "direction": direction as AnyObject ] case .myStarredRepos( let page, let perpage, let sort, let direction): return [ "sort": sort as AnyObject, "direction": direction as AnyObject, "page": page as AnyObject, "per_page": perpage as AnyObject ] case .allMyStarredRepos(let sort, let direction): return [ "sort": sort as AnyObject, "direction": direction as AnyObject, ] //notification case .myNotifications(let page, let perpage, let all, let participating): return [ "all": all as AnyObject, "participating": participating as AnyObject, "page": page as AnyObject, "per_page": perpage as AnyObject ] case .repoNotifications(_, _, let all, let participating): return [ "all": all as AnyObject, "participating": participating as AnyObject ] case .markNotificationsAsRead(let last_read_at): return [ "last_read_at": last_read_at as AnyObject ] case .markRepoNotificationsAsRead(_, _, let last_read_at): return [ "last_read_at": last_read_at as AnyObject ] //watching case .repoWatchers(let page, let perpage, _, _): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .userWatchedRepos(let page, let perpage, _): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] case .myWatchedRepos(let page, let perpage): return [ "page": page as AnyObject, "per_page": perpage as AnyObject ] // case WatchingRepo(_,_,let subscribed,let ignored): // return [ // "subscribed":subscribed, // "ignored":ignored // ] //forks case .userReposForks(let page, let perpage, let sort, _, _): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "sort": sort as AnyObject ] default: return nil } } public var task: Task { let encoding: ParameterEncoding switch self.method { case .post: encoding = JSONEncoding.default default: encoding = URLEncoding.default } if let requestParameters = parameters { return .requestParameters(parameters: requestParameters, encoding: encoding) } return .requestPlain } //Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self. public var sampleData: Data { switch self { case .myInfo: return "get user info.".data(using: String.Encoding.utf8)! case .myRepos: return "get user repos.".data(using: String.Encoding.utf8)! default : return "default".data(using: String.Encoding.utf8)! } } } // MARK: - Provider support public extension String { var URLEscapedString: String { return self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)! } } public func url(_ route: TargetType) -> String { print("api:\(route.baseURL.appendingPathComponent(route.path).absoluteString)") return route.baseURL.appendingPathComponent(route.path).absoluteString } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/IdentityAndTrust.swift ================================================ // // IdentityAndTrust.swift // BeeFun // // Created by 翁恒丛 on 2018/6/19. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit /// 定义一个结构体,存储认证相关信息 struct IdentityAndTrust { var identityRef: SecIdentity var trust: SecTrust var certArray: AnyObject static func extractIdentity(certificate path: String, type: String, password: String) -> IdentityAndTrust { var identityAndTrust: IdentityAndTrust? var securityError: OSStatus = errSecSuccess let path: String = Bundle.main.path(forResource: path, ofType: type)! let PKCS12Data = NSData(contentsOfFile: path)! let key: NSString = kSecImportExportPassphrase as NSString let options: NSDictionary = [key: password] //客户端证书密码 //create variable for holding security information //var privateKeyRef: SecKeyRef? = nil var items: CFArray? securityError = SecPKCS12Import(PKCS12Data, options, &items) if securityError == errSecSuccess { let certItemsArray = items as? [[String: AnyObject]] let dict: AnyObject? = certItemsArray?.first as AnyObject? if let certEntry: Dictionary = dict as? Dictionary { // grab the identity let identityPointer: AnyObject? = certEntry["identity"] let secIdentityRef = identityPointer as! SecIdentity print("\(String(describing: identityPointer)) :::: \(secIdentityRef)") // grab the trust let trustPointer: AnyObject? = certEntry["trust"] let trustRef = trustPointer as! SecTrust print("\(String(describing: trustPointer)) :::: \(trustRef)") // grab the cert let chainPointer: AnyObject? = certEntry["chain"] identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certArray: chainPointer!) } } return identityAndTrust! } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/IssueAPI.swift ================================================ // // IssueAPI.swift // BeeFun // // Created by WengHengcong on 2017/4/14. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import Foundation import Moya import Alamofire import ObjectMapper class InsideIssueProvider: MoyaProvider where Target: TargetType { override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) { super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights) } } struct IssueProvider { fileprivate static var endpointsClosure = { (target: IssueAPI) -> Endpoint in var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) return endpoint } static func stubBehaviour(_: IssueAPI) -> Moya.StubBehavior { return .never } static func DefaultProvider() -> InsideIssueProvider { return InsideIssueProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false) } fileprivate struct SharedProvider { static var instance = IssueProvider.DefaultProvider() } static var sharedProvider: InsideIssueProvider { get { return SharedProvider.instance } set (newSharedProvider) { SharedProvider.instance = newSharedProvider } } } /// Issue https://developer.github.com/v3/issues/ /// /// - allIssues: List all issues assigned to the authenticated user across all visible repositories including owned repositories, member repositories, and organization repositories /// - myIssues: List all issues across owned and member repositories assigned to the authenticated user /// - orgIssues: List all issues for a given organization assigned to the authenticated user /// - repoIssues: List issues for a repository /* { "page": page "per_page" milestone integer or string If an integer is passed, it should refer to a milestone by its number field. If the string * is passed, issues with any milestone are accepted. If the string none is passed, issues without milestones are returned. state string Indicates the state of the issues to return. Can be either open, closed, or all. Default: open assignee string Can be the name of a user. Pass in none for issues with no assigned user, and * for issues assigned to any user. creator string The user that created the issue. mentioned string A user that's mentioned in the issue. labels string A list of comma separated label names. Example: bug,ui,@high sort string What to sort results by. Can be either created, updated, comments. Default: created direction string The direction of the sort. Can be either asc or desc. Default: desc since string Only issues updated at or after this time are returned. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. } */ /// - repoSigleIssue: Get a single issue /// - createIssue: Create an issue /* { "title": "Found a bug", "body": "I'm having a problem with this.", "assignees": [ "octocat" ], "milestone": 1, "labels": [ "bug" ] } */ /// - editIssue: Edit an issue /// - lockIssue: Lock an issue /// - unlockIssue: Unlock an issue public enum IssueAPI { case allIssues(page:Int, perpage:Int, filter:String, state:String, labels:String, sort:String, direction:String) case myIssues(page:Int, perpage:Int, filter:String, state:String, labels:String, sort:String, direction:String) case orgIssues(page:Int, perpage:Int, organization:String, filter:String, state:String, labels:String, sort:String, direction:String) case repoIssues(owner:String, repo:String, para: [String: Any]) case repoSigleIssue(owner:String, repo:String, number:Int) case createIssue(owner:String, repo:String, body: [String: Any]) case editIssue(owner:String, repo:String, number:Int, title:String, body:String, assignee:String, milestone:Int, labels:String) case lockIssue(owner:String, repo:String, number:Int) case unlockIssue(owner:String, repo:String, number:Int) } extension IssueAPI: TargetType { public var headers: [String : String]? { var header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"] switch self { default: header = ["User-Agent": "BeeFunMac","Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"] return header } } public var parameterEncoding: ParameterEncoding { return Alamofire.ParameterEncoding.self as! ParameterEncoding } public var baseURL: URL { switch self { default: return URL(string: "https://api.github.com")! } } public var path: String { switch self { //issue case .allIssues: return "/issues" case .myIssues: return "/user/issues" case .orgIssues(_, _, let organization, _, _, _, _, _): return "/orgs/\(organization)/issues" case .repoIssues(let owner, let repo, _): return "/repos/\(owner)/\(repo)/issues" case .repoSigleIssue(let owner, let repo, let number): return "/repos/\(owner)/\(repo)/issues/\(number)" case .createIssue(let owner, let repo, _): return "/repos/\(owner)/\(repo)/issues" case .editIssue(let owner, let repo, let number, _, _, _, _, _): return "/repos/\(owner)/\(repo)/issues/\(number)" case .lockIssue(let owner, let repo, let number): return "/repos/\(owner)/\(repo)/issues/\(number)/lock" case .unlockIssue(let owner, let repo, let number): return "/repos/\(owner)/\(repo)/issues/\(number)/lock" } } public var method: Moya.Method { switch self { case .createIssue(_, _, _): return .post case .editIssue(_, _, _, _, _, _, _, _): return .patch case .lockIssue(_, _, _): return .put case .unlockIssue(_, _, _): return .delete default: return .get } } public var parameters: [String : Any]? { switch self { case .allIssues(let page, let perpage, let filter, let state, let labels, let sort, let direction): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "filter": filter as AnyObject, "state": state as AnyObject, "labels": labels as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .myIssues(let page, let perpage, let filter, let state, let labels, let sort, let direction): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "filter": filter as AnyObject, "state": state as AnyObject, "labels": labels as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .orgIssues(let page, let perpage, _, let filter, let state, let labels, let sort, let direction): return [ "page": page as AnyObject, "per_page": perpage as AnyObject, "filter": filter as AnyObject, "state": state as AnyObject, "labels": labels as AnyObject, "sort": sort as AnyObject, "direction": direction as AnyObject ] case .repoIssues(_, _, let para): return para case .createIssue(_, _, let body): return body case .editIssue(_, _, _, let title, let body, let assignee, let milestone, let labels): return [ "title": title as AnyObject, "body": body as AnyObject, "assignee": assignee as AnyObject, "milestone": milestone as AnyObject, "labels": labels as AnyObject ] default: return nil } } public var task: Task { let encoding: ParameterEncoding switch self.method { case .post: encoding = JSONEncoding.default default: encoding = URLEncoding.default } if let requestParameters = parameters { return .requestParameters(parameters: requestParameters, encoding: encoding) } return .requestPlain } //Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self. public var sampleData: Data { switch self { default : return "default".data(using: String.Encoding.utf8)! } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/LanguageManager.swift ================================================ // // LanguageManager.swift // BeeFun // // Created by WengHengcong on 11/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import Kanna import Alamofire import Moya /// 语言生成器 class LanguageManager { static let shared = LanguageManager() func generateLanguage() -> URL { let urlStr = "https://github.com/trending" guard let trendingURL = URL(string: urlStr) else { print("Error: \(urlStr) doesn't seem to be a valid URL") let defaultURL = URL(string: "https://github.com/trending") return defaultURL! } return trendingURL } func requestForLanguage() { var languageArr: [String]? = [] let trendingURL = generateLanguage() var request = URLRequest(url: trendingURL) request.httpMethod = "get" request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") Alamofire.request(request).responseString(completionHandler: { (response) in switch response.result { case .success: if let htmlSourceStirng = response.result.value { do { let doc = try HTML(html: htmlSourceStirng, encoding: .utf8) for repo in doc.xpath("//div[@class='select-menu js-menu-container js-select-menu']/div/div/div/div/a") { let repoStr = repo.content! let language = repoStr.trimmed if languageArr != nil { languageArr?.append(language) } } DispatchQueue.main.async { let nsArr = NSArray(array: languageArr!) let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray if let documentDirectory = paths[0] as? String { let path = documentDirectory.appending("/lan.plist") let fail = nsArr.write(toFile: path, atomically: true) if fail { } } } } catch { } } case .failure: break } }) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/Response+ObjectMapper.swift ================================================ // // Observable+ObjectMapper.swift // // Created by Ivan Bruel on 09/12/15. // Copyright © 2015 Ivan Bruel. All rights reserved. // import Foundation import Moya import ObjectMapper public extension Response { /// Maps data received from the signal into an object which implements the Mappable protocol. /// If the conversion fails, the signal errors. public func mapObject(_ type: T.Type) throws -> T { guard let object = Mapper().map(JSONObject: try mapJSON()) else { throw MoyaError.jsonMapping(self) } return object } /// Maps data received from the signal into an array of objects which implement the Mappable /// protocol. /// If the conversion fails, the signal errors. public func mapArray(_ type: T.Type) throws -> [T] { guard let objects = Mapper().mapArray(JSONObject: try mapJSON()) else { throw MoyaError.jsonMapping(self) } return objects } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/SVGProcessor.swift ================================================ // // SVGProcessor.swift // BeeFun // // Created by WengHengcong on 04/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import Kingfisher /* struct SVGProcessor: ImageProcessor { let imgSize: CGSize? init(size: CGSize? = CGSize(width:250, height:250)) { imgSize = size } // `identifier` should be the same for processors with same properties/functionality // It will be used when storing and retrieving the image to/from cache. let identifier = "com.junglesong.beefun" // Convert input data/image to target image and return it. func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? { switch item { case .image(let image): //already an image return image case .data(let data): return generateSVGImage(data: data, size: imgSize) ?? DefaultImageProcessor().process(item: item, options: options) } } } struct SVGCacheSerializer: CacheSerializer { func data(with image: Image, original: Data?) -> Data? { return original } func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? { return generateSVGImage(data: data) ?? image(with: data, options: options) } } func generateSVGImage(svgXml: String, size: CGSize? = CGSize(width:250, height:250)) -> UIImage?{ let frame = CGRect(x: 0, y: 0, width: size!.width, height: size!.height) if let _ = svgXml.base64Decoded { let svgLayer = SVGLayer(svgSource: svgXml) svgLayer.frame = frame return snapshotImage(for: svgLayer) } return nil } func generateSVGImage(data: Data, size: CGSize? = CGSize(width:250, height:250)) -> UIImage?{ let frame = CGRect(x: 0, y: 0, width: size!.width, height: size!.height) if let svgString = String(data: data, encoding: .utf8){ let svgLayer = SVGLayer(svgSource: svgString) svgLayer.frame = frame return snapshotImage(for: svgLayer) } return nil } func snapshotImage(for layer: CALayer) -> UIImage? { UIGraphicsBeginImageContextWithOptions(layer.bounds.size, false, UIScreen.main.scale) guard let context = UIGraphicsGetCurrentContext() else { return nil } layer.render(in: context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } */ ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/SearchAPI.swift ================================================ // // SearchAPI.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import Foundation import Moya import Alamofire import ObjectMapper class InsideSearchProvider: MoyaProvider where Target: TargetType { override init(endpointClosure: @escaping (Target) -> Endpoint, requestClosure: @escaping (Endpoint, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: @escaping (Target) -> StubBehavior, callbackQueue: DispatchQueue?, manager: Manager, plugins: [PluginType], trackInflights: Bool) { super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, callbackQueue: callbackQueue, manager: manager, plugins: plugins, trackInflights: trackInflights) } } struct SearchProvider { fileprivate static var endpointsClosure = { (target: SearchAPI) -> Endpoint in var endpoint: Endpoint = Endpoint(url: url(target), sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, task: target.task, httpHeaderFields: target.headers) return endpoint } static func stubBehaviour(_: SearchAPI) -> Moya.StubBehavior { return .never } static func DefaultProvider() -> InsideSearchProvider { return InsideSearchProvider(endpointClosure: endpointsClosure, requestClosure: MoyaProvider.defaultRequestMapping, stubClosure: MoyaProvider.neverStub, callbackQueue: DispatchQueue.main, manager: Alamofire.SessionManager.default, plugins: [], trackInflights: false) } fileprivate struct SharedProvider { static var instance = SearchProvider.DefaultProvider() } static var sharedProvider: InsideSearchProvider { get { return SharedProvider.instance } set (newSharedProvider) { SharedProvider.instance = newSharedProvider } } } public enum SearchAPI { //search case search(para: SESearchBaseModel) case searchCommit(para: SESearchBaseModel) } extension SearchAPI: TargetType { public var headers: [String: String]? { var header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.v3.star+json"] switch self { case .searchCommit: //https://developer.github.com/v3/search/#search-commits header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0", "Accept": "application/vnd.github.cloak-preview"] default: header = ["User-Agent": "BeeFunMac", "Authorization": AppToken.shared.access_token ?? "", "timeoutInterval": "15.0"] return header } return header } public var parameterEncoding: ParameterEncoding { return Alamofire.ParameterEncoding.self as! ParameterEncoding } public var baseURL: URL { switch self { default: return URL(string: "https://api.github.com/search")! } } public var path: String { switch self { //search case .search(let para): return "/\(para.requestUrl)" case .searchCommit(let para): return "/\(para.requestUrl)" } } public var method: Moya.Method { switch self { default: return .get } } public var parameters: [String: Any]? { switch self { case .search(let para): return [ "q": para.q as AnyObject, "sort": para.sort as AnyObject, "order": para.order as AnyObject, "page": para.page as AnyObject, "per_page": para.perPage as AnyObject ] case .searchCommit(let para): return [ "q": para.q as AnyObject, "sort": para.sort as AnyObject, "order": para.order as AnyObject, "page": para.page as AnyObject, "per_page": para.perPage as AnyObject ] } } public var task: Task { let encoding: ParameterEncoding switch self.method { case .post: encoding = JSONEncoding.default default: encoding = URLEncoding.default } if let requestParameters = parameters { return .requestParameters(parameters: requestParameters, encoding: encoding) } return .requestPlain } //Any target you want to hit must provide some non-nil NSData that represents a sample response. This can be used later for tests or for providing offline support for developers. This should depend on self. public var sampleData: Data { switch self { default : return "default".data(using: String.Encoding.utf8)! } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Network/TrendingManager.swift ================================================ // // TrendingManager.swift // BeeFun // // Created by WengHengcong on 30/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import Kanna import Alamofire import Moya typealias TrendingRepositoriesDone = ((_ repos: [ObjRepos]) -> Void)? typealias TrendingDevelopersDone = ((_ repos: [ObjUser]) -> Void)? typealias TrendingShowcasessDone = ((_ repos: [ObjShowcase]) -> Void)? typealias TrendingShowcasessDetailDone = ((_ repos: [ObjRepos]) -> Void)? /// 参考: https://www.raywenderlich.com/14172/how-to-parse-html-on-ios class TrendingManager { static let shared = TrendingManager() // MARK: - Trending Reops func generateTrendingRepositoriesUrl(since: String, language: String) -> URL { //https://github.com/trending?since=weekly //https://github.com/trending/java?since=weekly var urlStr = "https://github.com/trending" if !since.isEmpty && !language.isEmpty { if language.lowercased() == "all".localized { urlStr = String(format: "https://github.com/trending?since=%@", since.lowercased()) } else { urlStr = String(format: "https://github.com/trending/%@?since=%@", language.lowercased(), since.lowercased()) } } guard let trendingURL = URL(string: urlStr) else { print("Error: \(urlStr) doesn't seem to be a valid URL") let defaultURL = URL(string: "https://github.com/trending") return defaultURL! } return trendingURL } func requestForTrendingRepositories(since: String, language: String, done: TrendingRepositoriesDone) { let trendingURL = generateTrendingRepositoriesUrl(since: since, language: language) var request = URLRequest(url: trendingURL) request.httpMethod = "get" // request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") // request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") Alamofire.request(request).responseString(completionHandler: { (response) in switch response.result { case .success: if let htmlSourceStirng = response.result.value { do { //............ let doc = try HTML(html: htmlSourceStirng, encoding: .utf8) var reposArr: [ObjRepos] = [] for repo in doc.xpath("//ol[@class='repo-list']/li") { let repoStr = repo.content! let orginArr = repoStr.split("\n") var itemArr: [String] = [] for value in orginArr { let trimmedValue = value.trimmed if trimmedValue != "Star" && trimmedValue != "Unstar" && trimmedValue != "Built by" { itemArr.append(trimmedValue) } } let obj = ObjRepos() //owner name/ repo name obj.full_name = itemArr[0] let owner = ObjUser() owner.login = obj.full_name?.split("/")[0].trimmed obj.owner = owner obj.name = obj.full_name?.split("/")[1].trimmed //0、1 默认未name/desc if itemArr.count == 6 { /* - 0 : "wearehive / project-guidelines" - 1 : "A set of best practices for JavaScript projects" - 2 : "JavaScript" - 3 : "2,550" - 4 : "132" - 5 : "2,033 stars today" */ obj.cdescription = itemArr[1] obj.language = itemArr[2] obj.trending_star_text = itemArr[3] obj.trending_fork_text = itemArr[4] obj.trending_star_interval_text = itemArr[5] } else if itemArr.count == 5 { obj.cdescription = itemArr[1] if itemArr[2].isOnlyNumeric { /* - 2 : "929" - 3 : "35" - 4 : "298 stars today" */ obj.trending_star_text = itemArr[2] if itemArr[3].isOnlyNumeric { obj.trending_fork_text = itemArr[3] } if itemArr[4].contains("star") { obj.trending_star_interval_text = itemArr[4] } } else { /* - 2 : " MQL4" - 3 : " 34" - 4 : " 2" */ obj.language = itemArr[2] if itemArr[3].isOnlyNumeric { obj.trending_star_text = itemArr[3] } if itemArr[4].isOnlyNumeric { obj.trending_fork_text = itemArr[4] } } } else if itemArr.count == 4 { /* - 2 : " MQL4" - 3 : " 4" or - 2 : " 55" - 3 : " 4" or - 2 : " 4" - 3 : " 98 stars today" or - 0 : "breakermind / Mql4" - 1 : "MQL4" - 2 : "7" - 3 : "11" */ if itemArr[1].lowercased() == language.lowercased() { obj.language = itemArr[1] } if itemArr[2].isOnlyNumeric { obj.trending_star_text = itemArr[2] if itemArr[3].contains("star") { obj.trending_star_interval_text = itemArr[3] } else if itemArr[3].isOnlyNumeric { obj.trending_fork_text = itemArr[3] } } else { obj.language = itemArr[2] if itemArr[3].isOnlyNumeric { obj.trending_star_text = itemArr[3] } } } else if itemArr.count == 3 { /* - 0 : "Lucas170 / Chapter-13-All-Files" - 1 : "MQL4" - 2 : "1" or - 0 : "Lucas170 / Chapter-13-All-Files" - 1 : "desc" - 2 : "1" or - 0 : "Lucas170 / Chapter-13-All-Files" - 1 : "5" - 2 : "1" or - 0 : "Lucas170 / Chapter-13-All-Files" - 1 : "5" - 2 : "1 star today" */ if itemArr[1].lowercased() == language.lowercased() { obj.language = itemArr[1] obj.trending_star_text = itemArr[2] } else if itemArr[1].isOnlyNumeric { obj.trending_star_text = itemArr[1] if itemArr[2].isOnlyNumeric { obj.trending_fork_text = itemArr[2] } else if itemArr[3].contains("star") { obj.trending_star_interval_text = itemArr[2] } } else { obj.cdescription = itemArr[1] obj.trending_star_text = itemArr[2] } } reposArr.append(obj) } DispatchQueue.main.async { if let doneCom = done { doneCom(reposArr) } } //............ } catch { } } case .failure: break } }) } // MARK: - Trending Developer func generateTrendingDeveloperUrl(since: String, language: String) -> URL { //https://github.com/trending/developers/java?since=weekly //https://github.com/trending/developers?since=weekly var urlStr = "https://github.com/trending/developers" if !since.isEmpty && !language.isEmpty { if language.lowercased() == "all".localized { urlStr = String(format: "https://github.com/trending/developers?since=%@", since.lowercased()) } else { urlStr = String(format: "https://github.com/trending/developers/%@?since=%@", language.lowercased(), since.lowercased()) } } guard let trendingURL = URL(string: urlStr) else { print("Error: \(urlStr) doesn't seem to be a valid URL") let defaultURL = URL(string: "https://github.com/trending") return defaultURL! } return trendingURL } func requestForTrendingDeveloper(since: String, language: String, done: TrendingDevelopersDone) { let trendingURL = generateTrendingDeveloperUrl(since: since, language: language) var request = URLRequest(url: trendingURL) request.httpMethod = "get" // request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") // request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") Alamofire.request(request).responseString(completionHandler: { (response) in switch response.result { case .success: if let htmlSourceStirng = response.result.value { // print("HTML : \(myHTMLString)") do { //............ let doc = try HTML(html: htmlSourceStirng, encoding: .utf8) // print(doc.title) // Search for nodes by CSS // for link in doc.css("a, link") { // print(link.text) // print(link["href"]) // } // Search for nodes by XPath var userArr: [ObjUser] = [] for (index, user) in doc.xpath("//div[@class='explore-content']/ol/li").enumerated() { let userStr = user.content! let orginArr = userStr.split("\n") var itemArr: [String] = [] for value in orginArr { let trimmedValue = value.trimmed if trimmedValue != "Follow" && trimmedValue != "Unfollow" { itemArr.append(trimmedValue) } } let obj = ObjUser() /* - 0 : " 3" - 1 : " Bogdan-Lyashenko" */ obj.trend_repo_order = itemArr[0].int obj.login = itemArr[1] if itemArr.count == 5 { /* - 2 : " (Bohdan Liashenko)" - 3 : " Under-the-hood-ReactJS" - 4 : " Entire ReactJS code base explanation by visual block schemes (Stack+Fiber versions) " */ obj.trend_user_name = itemArr[2] obj.trend_repo_name = itemArr[3] obj.trend_repo_desc = itemArr[4] } else if itemArr.count == 4 { /* - 2 : " Under-the-hood-ReactJS" - 3 : " Entire ReactJS code base explanation by visual block schemes (Stack+Fiber versions) " */ obj.trend_repo_name = itemArr[2] obj.trend_repo_desc = itemArr[3] } //头像 let imgXpath = String(format: "(//div[@class='d-flex']/div[@class='mx-2']/a/img)[%d]", index+1) for img in user.xpath(imgXpath) { if let avatarUrl = img["src"] { obj.avatar_url = avatarUrl } } userArr.append(obj) } DispatchQueue.main.async { if let doneCom = done { doneCom(userArr) } } //............ } catch { } } case .failure: break } }) } // MARK: - Trending Showcase func generateTrendingShowcaseUrl(page: Int) -> URL { //https://github.com/showcases //https://github.com/showcases?page=2 var urlStr = "https://github.com/showcases" if page > 1 { urlStr = String(format: "https://github.com/showcases?page=%d", page) } else { urlStr = "https://github.com/showcases" } guard let trendingURL = URL(string: urlStr) else { print("Error: \(urlStr) doesn't seem to be a valid URL") let defaultURL = URL(string: "https://github.com/trending") return defaultURL! } return trendingURL } func requestForTrendingShowcase(page: Int, done: TrendingShowcasessDone) { let trendingURL = generateTrendingShowcaseUrl(page: page) var request = URLRequest(url: trendingURL) request.httpMethod = "get" request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") Alamofire.request(request).responseString(completionHandler: { (response) in switch response.result { case .success: if let htmlSourceStirng = response.result.value { do { let doc = try HTML(html: htmlSourceStirng, encoding: .utf8) var caseArr: [ObjShowcase] = [] for (_, showcase) in doc.xpath("//ul[@class='exploregrid gutter']/li").enumerated() { let userStr = showcase.content! let itemArr = userStr.split("\n") let obj = ObjShowcase() if itemArr.count >= 4 { obj.name = itemArr[0].trimmed obj.cdescription = itemArr[1].trimmed obj.trend_repo_text = itemArr[2].trimmed obj.trend_lan_text = itemArr[3].trimmed } //背景 let svgXpath = String(format: "//a/div[@class='exploregrid-item-header']") for svgDiv in showcase.xpath(svgXpath) { if let avatarUrl = svgDiv["style"] { var base64Content = avatarUrl.replacing("background-image: url(data:image/svg+xml;base64,", with: "") base64Content = base64Content.replacing(");", with: "") obj.svgXml = base64Content } } caseArr.append(obj) } DispatchQueue.main.async { if let doneCom = done { doneCom(caseArr) } } } catch { } } case .failure: break } }) } // MARK: - Trending Showcase Detail func generateTrendingShowcaseDetailUrl(showcase: String) -> URL { //https://github.com/showcases/web-accessibility var urlStr = "https://github.com/showcases/swift" if !showcase.isEmpty { let showcaseTranser = showcase.trimmed.replacing(" ", with: "-") urlStr = String(format: "https://github.com/showcases/%@", showcaseTranser) } else { urlStr = "https://github.com/showcases/swift" } guard let trendingURL = URL(string: urlStr) else { print("Error: \(urlStr) doesn't seem to be a valid URL") let defaultURL = URL(string: "https://github.com/trending") return defaultURL! } return trendingURL } func requestForTrendingShowcaseDetail(showcase: String, done: TrendingShowcasessDetailDone) { let trendingURL = generateTrendingShowcaseDetailUrl(showcase: showcase) var request = URLRequest(url: trendingURL) request.httpMethod = "get" request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") Alamofire.request(request).responseString(completionHandler: { (response) in switch response.result { case .success: if let htmlSourceStirng = response.result.value { do { let doc = try HTML(html: htmlSourceStirng, encoding: .utf8) var reposArr: [ObjRepos] = [] for (index, repoLi) in doc.xpath("//ul[@class='repo-list showcase-page-repo-list']/li").enumerated() { let userStr = repoLi.content! let orginArr = userStr.split("\n") var itemArr: [String] = [] for value in orginArr { let trimmedValue = value.trimmed.lowercased() if trimmedValue.contains("Starred".lowercased()) || trimmedValue.contains("people".lowercased()) || trimmedValue.contains("know".lowercased()) { } else { itemArr.append(value.trimmed) } } let obj = ObjRepos() obj.full_name = itemArr[0].trimmed let owner = ObjUser() owner.login = obj.full_name?.split("/")[0].trimmed obj.owner = owner obj.name = obj.full_name?.split("/")[1].trimmed if itemArr.count == 6 { /* - 0 : " buunguyen / octotree" - 1 : " Code tree for GitHub" - 2 : " JavaScript" - 3 : " 9,355" - 4 : " 769" - 5 : " Updated May 16, 2017" */ obj.cdescription = itemArr[1] obj.language = itemArr[2] obj.trending_star_text = itemArr[3] obj.trending_fork_text = itemArr[4] obj.trending_showcase_update_text = itemArr[5] //头像 let imgXpath = String(format: "(//ul[@class='repo-list showcase-page-repo-list']/li/a/img)[%d]", index+1) for img in doc.xpath(imgXpath) { if let avatarUrl = img["src"] { obj.owner?.avatar_url = avatarUrl } } } else if itemArr.count == 5 { /* - 0 : " sindresorhus / notifier-for-github" - 1 : " Browser extension that displays your GitHub notifications unread count. Available on Chrome, Firefox, Opera, Safari." - 2 : " 233" - 3 : " 21" - 4 : " Updated Jun 9, 2017" or - 0 : " bitoiu / github-red-alert" - 1 : " Changes the GitHub notification icon to red if you have unread participating notifications." - 2 : " CoffeeScript" - 3 : " 3" - 4 : " Updated Oct 31, 2016" */ obj.cdescription = itemArr[1] //无语言 if itemArr[2].trimmed.isOnlyNumeric { obj.trending_star_text = itemArr[2] obj.trending_fork_text = itemArr[3] obj.trending_showcase_update_text = itemArr[4] } else { //有语言,只读star obj.language = itemArr[2] obj.trending_star_text = itemArr[3] obj.trending_showcase_update_text = itemArr[4] } //头像 let imgXpath = String(format: "(//ul[@class='repo-list showcase-page-repo-list']/li/a/img)[%d]", index+1) for img in doc.xpath(imgXpath) { if let avatarUrl = img["src"] { obj.owner?.avatar_url = avatarUrl } } } reposArr.append(obj) } DispatchQueue.main.async { if let doneCom = done { doneCom(reposArr) } } } catch { } } case .failure: break } }) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFCommonString.swift ================================================ // // ComonString.swift // BeeFun // // Created by WengHengcong on 2017/3/9. // Copyright © 2017年 JungleSong. All rights reserved. // public let kSignEmptySpace = " " /// 省略号 public let kSignApostrophe = "..." /// 登录提示 public let kLoginFirstTip = "Please login first".localized /// 无数据提示 public let kNoDataFoundTip = "No Data Found".localized /// 网络出错提示 public let kNetworkErrorTip = "Network error /(ㄒoㄒ)/~~".localized /// 下拉刷新提示 public let kHeaderIdelTIP = "Pull down to refresh".localized /// 下拉刷新提示 public let kHeaderPullTip = "Release to refresh".localized /// 下拉中 public let kHeaderPullingTip = "Loading".localized+kSignApostrophe /// 上拉加载无数据提示 public let kFooterIdleTip = "".localized /// 上拉加载提示 public let kFooterLoadTip = "Load".localized+"More".localized+kSignApostrophe /// 上拉加载无数据提示 public let kFooterLoadNoDataTip = "No More data".localized public let kChineseLanguage = "zh-Hans" public let kEnglishLanguage = "en" public let kWatchingTip = "registers the user to receive notifications on new discussions".localized public let kStaringTip = "lets users bookmark repositories.".localized public let KForkingTip = "A fork is a copy of a repository.".localized public let KMailSubject = "Suggestions or report bugs".localized public let KMyIcloudEmail = "wenghengcong@icloud.com" public let KSendEmailErrorTitle = "Could not send Email" public let KSendEmailErrorContent = "Your device could not send e-mail. Please check e-mail configuration and try again." public let kAliPayMe = "alipayqr://platformapi/startapp?saId=10000007&qrcode=HTTPS%3a%2f%2fQR.ALIPAY.COM%2fFKX02008UEOALIPOFQRDAF" public let kAliPayPing = "alipayqr://platformapi/startapp?saId=10000007&qrcode=HTTPS%3a%2f%2fQR.ALIPAY.COM%2fFKX010935UVTHIGVFBSM2B" ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFNotificationName.swift ================================================ // // DeviceCfg.swift // BeeFun // // Created by wenghengcong on 16/1/3. // Copyright © 2016年 JungleSong. All rights reserved. // extension Notification.Name { public struct BeeFun { public static let WillLogin = Notification.Name(rawValue: "com.luci.beefun.mac.willlogin") public static let DidLogin = Notification.Name(rawValue: "com.luci.beefun.mac.didlogin") /// 获取到oauth token public static let GetOAuthToken = Notification.Name(rawValue: "com.luci.beefun.mac.gettoken") /// 登录后,获取到用户信息 public static let GetUserInfo = Notification.Name(rawValue: "com.luci.beefun.mac.getuserinfo") /// 用户操作改变了数据库 public static let databaseChanged = Notification.Name(rawValue: "com.luci.beefun.mac.databaseChanged") /// 同步操作 public static let SyncStarRepoStart = Notification.Name(rawValue: "com.luci.beefun.mac.syncStarRepoStart") public static let SyncStarRepoEnd = Notification.Name(rawValue: "com.luci.beefun.mac.syncStarRepoEnd") public static let WillLogout = Notification.Name(rawValue: "com.luci.beefun.mac.willlogout") public static let DidLogout = Notification.Name(rawValue: "com.luci.beefun.mac.didlogout") public static let AddTag = Notification.Name(rawValue: "com.luci.beefun.mac.addtag") public static let UpdateTag = Notification.Name(rawValue: "com.luci.beefun.mac.updatetag") public static let DelTag = Notification.Name(rawValue: "com.luci.beefun.mac.deltag") public static let RepoUpdateTag = Notification.Name(rawValue: "com.luci.beefun.mac.repoupdatetag") /// Network reachablity public static let NotReachable = Notification.Name(rawValue: "com.luci.beefun.mac.NotReachable") public static let Unknown = Notification.Name(rawValue: "com.luci.beefun.mac.Unknown") public static let ReachableAfterUnreachable = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableAfterUnreachable") public static let ReachableWiFi = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableWiFi") public static let ReachableCellular = Notification.Name(rawValue: "com.luci.beefun.mac.ReachableCellular") public static let UnReachableAfterReachable = Notification.Name(rawValue: "com.luci.beefun.mac.UnReachableAfterReachable") /// Star Action public static let didStarRepo = Notification.Name(rawValue: "com.luci.beefun.mac.didStarRepo") /// UnStar Action public static let didUnStarRepo = Notification.Name(rawValue: "com.luci.beefun.mac.ddiUnStarRepo") } } ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFPlistResourcesKey.swift ================================================ // // BFPlistStoreKey.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // public let kStoreHistoryRecordsKey = "kStoreHistoryRecordsKey" ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFStyleGuide.swift ================================================ // // BFStyleGuide.swift // BeeFun // // Created by wenghengcong on 16/1/6. // Copyright © 2016年 JungleSong. All rights reserved. // import Foundation import UIKit class BFStyleGuide { class func textFieldPlaceholderAttributes() -> [NSAttributedString.Key: Any] { let font = UIFont.middleSizeSystemFont() let color = UIColor.iOS11MidGray return [ NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: color ] } class func textFieldTextAttributes() -> [NSAttributedString.Key: Any] { let font = UIFont.largeSizeSystemFont() let color = UIColor.iOS11Black return [ NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: color ] } class func navTitleTextAttributes() -> [NSAttributedString.Key: Any] { let font = UIFont.hugeSizeSystemFont() let color = UIColor.iOS11White return [ NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: color ] } } ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFThirdLibKey.swift ================================================ // // Key+Project.swift // BeeFun // // Created by wenghengcong on 16/1/8. // Copyright © 2016年 JungleSong. All rights reserved. // // MARK: - Apple https://developer.apple.com/library/archive/qa/qa1633/_index.html public let AppleAppID = "" public let SocialAppStore = "https://itunes.apple.com/app/id1393808664" public let BeeFunAppStore = "itms-apps://itunes.apple.com/app/id1393808664" public let AppBundleIdentifier = "com.luci.beefun.ios" public let APNsAuthKeyID = "" // MARK: - BeeFun,已经下线,后期补上 public let AppOfficeSite = "http://www.beefun.top" public let AppOfficeShortSite = "www.beefun.top" // MARK: - Github public let GithubAppClientId = "" public let GithubAppClientSecret = "" public let GithubAppRedirectUrl = "beefunios://www.beefun.top" //https://developer.github.com/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/ public let GithubAppScope = "user,repo,notifications,gist,admin:repo_hook,admin:org_hook,admin:org" // MARK: - 新浪 // MARK: 短链接服务 public let ShortSocialAppStore = "http://t.cn/RdxKhoY" public let ShortSocailGithub = "http://t.cn/Rqvjd6W" public let ShortOfficeWebsite = "http://t.cn/R0QpGhp" // MARK: 微博 public let WeiboSDKAppKey = "" public let WeiboSDKAppSecret = "" // MARK: - 腾讯 // MARK: Bugly public let TencentBuglyAppID = "" // MARK: 微信 public let WeiXinSDKAppID = "" public let WeiXinSDKAppSecret = "" // MARK: 腾讯开发平台 public let TencentSDKAppID = "" public let TencentSDKAppKey = "" // MARK: - 阿里 // MARK: 友盟 public let UMengAppSecret = "" public let SocailGithub = "https://github.com/wenghengcong/BeeFun-Pro" // MARK: 钉钉 public let DingTalkSDKAppID = "" public let DingTalkSDKAppSecret = "" // MARK: - Share SDK public let ShareSDKAppKey = "" public let ShareSDKAppSecret = "" // MARK: - 极光 // https://www.jiguang.cn/ public let JPushAppKey = "" public let JPushAppSecret = "" public let JPushChannel = "App Store" // MARK: - 国外服务 // MARK:facebook public let FackbookSDKAppID = "" public let FackbookSDKAppSecret = "" // MARK: twitter public let TwitterSDKConsumerKey = "" public let TwitterSDKConsumerSecret = "" // MARK: linkedin public let LinkedInSDKAppID = "" public let LinkedInSDKAppSecret = "" // MARK: - 有道云笔记 public let YDNoteSDKConsumerKey = "" public let YDNoteSDKConsumerSecret = "" ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/BFUserDefaultManager.swift ================================================ // // BFUserDefaultKey.swift // BeeFun // // Created by WengHengcong on 2018/1/30. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit public class BFUserDefaultManager { static let shared = BFUserDefaultManager() fileprivate let userDefaults = UserDefaults.standard // MARK: - Key // MARK: 搜索记录 fileprivate let searchHistoryKey = "searchHistoryKey" // MARK: - Private fileprivate init() { registerUserDefault() } fileprivate func registerUserDefault() { } // MARK: - Public for use /// 搜索结果记录 var searchHistory: [String]? { get { return userDefaults.object(forKey: searchHistoryKey) as? [String] } set { userDefaults.set(newValue, forKey: searchHistoryKey) userDefaults.synchronize() } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/UIColor+Project.swift ================================================ // // UIColor+Project.swift // BeeFun // // Created by wenghengcong on 16/1/3. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Foundation extension UIColor { // MARK: - iOS 11 Gray scale class var iOS11White: UIColor { return UIColor.hex("ffffff", alpha: 1.0) } class var iOS11GrayLevel1: UIColor { return UIColor.hex("efeff4", alpha: 1.0) } // MARK: GrayLevel2 = LightGray class var iOS11GrayLevel2: UIColor { return UIColor.hex("e5e5ea", alpha: 1.0) } class var iOS11LightGray: UIColor { return UIColor.hex("e5e5ea", alpha: 1.0) } class var iOS11GrayLevel3: UIColor { return UIColor.hex("d1d1d6", alpha: 1.0) } // MARK: GrayLevel4 = MidGray class var iOS11GrayLevel4: UIColor { return UIColor.hex("c7c7c7", alpha: 1.0) } class var iOS11MidGray: UIColor { return UIColor.hex("c7c7c7", alpha: 1.0) } class var iOS11GrayLevel5: UIColor { return UIColor.hex("8e8e93", alpha: 1.0) } class var iOS11Gray: UIColor { return UIColor.hex("8e8e93", alpha: 1.0) } class var iOS11Black: UIColor { //black return UIColor.hex("000000", alpha: 1.0) } // MARK: - iOS 11 Spectrum class var iOS11Red: UIColor { return UIColor.hex("ff3b30", alpha: 1.0) } class var iOS11Orange: UIColor { return UIColor.hex("ff9500", alpha: 1.0) } class var iOS11Yellow: UIColor { return UIColor.hex("ffcc00", alpha: 1.0) } class var iOS11Green: UIColor { return UIColor.hex("4cd964", alpha: 1.0) } class var iOS11TealBlue: UIColor { return UIColor.hex("5ac8fa", alpha: 1.0) } class var iOS11Blue: UIColor { return UIColor.hex("007aff", alpha: 1.0) } class var iOS11Purple: UIColor { return UIColor.hex("5856d6", alpha: 1.0) } class var iOS11Pink: UIColor { return UIColor.hex("ff2d55", alpha: 1.0) } // MARK: - BeeFun Color class var bfTabBarTitleTextColor: UIColor { //red return UIColor.hex("d81e06", alpha: 1.0) } // MARK: label class var bfLabelSubtitleTextColor: UIColor { //black return UIColor.hex("7b7b7b", alpha: 1.0) } // MARK: view class var bfViewBackgroundColor: UIColor { return UIColor.hex("f5f5f5", alpha: 1.0) } //line class var bfLineBackgroundColor: UIColor { return UIColor.hex("ceced2", alpha: 1.0) } class var bfRedColor: UIColor { //red return UIColor.hex("e31100", alpha: 1.0) } class var bfBlueColor: UIColor { //red return UIColor.hex("5677fc", alpha: 1.0) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/ProConfig/UIFont+Project.swift ================================================ // // UIFont+Project.swift // BeeFun // // Created by wenghengcong on 16/1/3. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit extension UIFont { //PingFang Light、Medium、Regular、Thin、Ultralight、Semibold enum CPEFontSize: CGFloat { case tinyFontSize = 10 case smallFontSize = 12 case middleFontSize = 14 case largeFontSize = 15 case hugeFontSize = 17 } class func bfSystemFont(ofSize: CGFloat) -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: ofSize)! } return UIFont.systemFont(ofSize: ofSize) } class func bfBoldSystemFont(ofSize: CGFloat) -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: ofSize)! } return UIFont.systemFont(ofSize: ofSize) } // MARK: system font class func tinySizeSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.tinyFontSize.rawValue)! } return UIFont.systemFont(ofSize: CPEFontSize.tinyFontSize.rawValue) } class func smallSizeSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.smallFontSize.rawValue)! } return UIFont.systemFont(ofSize: CPEFontSize.smallFontSize.rawValue) } class func middleSizeSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.middleFontSize.rawValue)! } return UIFont.systemFont(ofSize: CPEFontSize.middleFontSize.rawValue) } class func largeSizeSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.largeFontSize.rawValue)! } return UIFont.systemFont(ofSize: CPEFontSize.largeFontSize.rawValue) } class func hugeSizeSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: CPEFontSize.hugeFontSize.rawValue)! } return UIFont.systemFont(ofSize: CPEFontSize.hugeFontSize.rawValue) } // MARK: system bold font class func tinySizeBoldSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.tinyFontSize.rawValue)! } return UIFont.boldSystemFont(ofSize: CPEFontSize.tinyFontSize.rawValue) } class func smallSizeBoldSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.smallFontSize.rawValue)! } return UIFont.boldSystemFont(ofSize: CPEFontSize.smallFontSize.rawValue) } class func middleSizeBoldSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.middleFontSize.rawValue)! } return UIFont.boldSystemFont(ofSize: CPEFontSize.middleFontSize.rawValue) } class func largeSizeBoldSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.largeFontSize.rawValue)! } return UIFont.boldSystemFont(ofSize: CPEFontSize.largeFontSize.rawValue) } class func hugeSizeBoldSystemFont() -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Medium", size: CPEFontSize.hugeFontSize.rawValue)! } return UIFont.boldSystemFont(ofSize: CPEFontSize.hugeFontSize.rawValue) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/BFDocument.swift ================================================ // // BFDocument.swift // BeeFun // // Created by WengHengcong on 2017/12/5. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class BFDocument: UIDocument { var data: NSData? override func load(fromContents contents: Any, ofType typeName: String?) throws { // Load your document from contents if let validData: NSData = contents as? NSData { self.data = validData.copy() as? NSData } } override func contents(forType typeName: String) throws -> Any { // Encode your document with an instance of NSData or NSFileWrapper if self.data == nil { self.data = NSData() } return self.data ?? NSData() } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLConnection.swift ================================================ // // SQLConnection.swift // BeeFunMac // // Created by WengHengcong on 2017/12/28. // Copyright © 2017年 LuCi. All rights reserved. // import SQLite extension Connection { public func exists(column: String, in table: String) throws -> Bool { let stmt = try prepare("PRAGMA table_info(\(table))") let columnNames = stmt.makeIterator().map { (row) -> String in return row[1] as? String ?? "" } return columnNames.contains(where: { dbColumn -> Bool in return dbColumn.caseInsensitiveCompare(column) == ComparisonResult.orderedSame }) } func tableExists(tableName: String) -> Bool { var exist = false do { exist = try SQLManager.githubDb.scalar( "SELECT EXISTS (SELECT * FROM sqlite_master WHERE type = 'table' AND name = ?)", tableName ) as! Int64 > 0 } catch { } return exist } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLHelper.swift ================================================ // // SQLManagerHelper.swift // BeeFun // // Created by WengHengcong on 23/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import SQLite /// sql order /// /// - asc: 升序 /// - desc: 降序 enum SQLOrder { case asc case desc } struct SQLHelper { static func SQLBlob(stringarray: [String]?) -> Blob { let blob = NSKeyedArchiver.archivedData(withRootObject: stringarray ?? [String]() ).datatypeValue return blob } static func SQLBlob(intarray: [Int]?) -> Blob { let blob = NSKeyedArchiver.archivedData(withRootObject: intarray ?? [Int]() ).datatypeValue return blob } static func stringArray(blob: Blob? ) -> [String] { var array: [String] = [] if blob != nil { let data = Data.fromDatatypeValue(blob!) array = NSKeyedUnarchiver.unarchiveObject(with: data) as! [String] } return array } static func intArray(blob: Blob? ) -> [Int] { var array: [Int] = [] if blob != nil { let data = Data.fromDatatypeValue(blob!) array = NSKeyedUnarchiver.unarchiveObject(with: data) as! [Int] } return array } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLLists.swift ================================================ // // SQLLists.swift // BeeFun // // Created by WengHengcong on 02/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class SQLLists { } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLManager.swift ================================================ // // SQLManager.swift // BeeFun // // Created by WengHengcong on 19/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import SQLite enum SQLiteError: Error { case connecttion } enum SQLiteAction: Int { case insert case update case delete case query } struct SQLManager { static let githubDatabaseName = "github.sqlite3" static func createAllTables() { //建表 SQLStars.crateStarReposTable() SQLTags.crateStarTagsTable() } static var githubDb: Connection = { let sqlBridge = JSSQLiteSwiftBridge() sqlBridge.dbName = githubDatabaseName return sqlBridge.connection() }() static func checkDBValid() { if let url = BFPathManager.shared.localDocumentURL(fileName: SQLManager.githubDatabaseName), !FileManager.default.fileExists(atPath: url.path) { //无本地数据库,开始下载创建本地数据库 _ = SQLManager.githubDb SQLManager.createAllTables() } else if !self.checkTableExist(SQLStars.starTableName) || !self.checkTableExist(SQLTags.starTagsName) { //有本地数据库,则重新下载最新数据 SQLStars.crateStarReposTable() SQLManager.beginDownloadDataToDB() } } static func checkTableExist(_ tableName: String) -> Bool { return SQLManager.githubDb.tableExists(tableName: tableName) } static func beginDownloadDataToDB() { /// 首次启动同步网络数据 } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStar+Delete.swift ================================================ // // SQLStar+Delete.swift // BeeFun // // Created by WengHengcong on 2018/2/1. // Copyright © 2018年 LuCi. All rights reserved. // import SQLite extension SQLStars { // MARK: - 针对所有repos /// 针对所有repos, 删除tag static func delete(tag: ObjTag) { var changeArr: [ObjRepos] = [] let findTagStar = SQLStars.findStarRepos(tag: tag) if findTagStar != nil && !findTagStar!.isEmpty { for item in findTagStar! { if let repotags = item.star_tags { if repotags.contains(tag.name!) { item.star_tags?.removeAll(tag.name!) changeArr.append(item) } } } } if !changeArr.isEmpty { SQLStars.insert(repos: changeArr) } } // MARK: - 针对单条repos数据 /// 针对单条repos, 删除tag字符串对象 static func delete(repo: ObjRepos, tagObj: ObjTag) { if tagObj.name!.isEmpty || repo.id == nil { return } self.delete(repo: repo, tag: tagObj.name!) } /// 针对单条repos, 删除tag字符串 static func delete(repo: ObjRepos, tag: String) { if tag.isEmpty || repo.id == nil { return } do { if let needUpdateId = repo.id { if let repotags = repo.star_tags { var afterDel = repotags //删除tag后的tags if afterDel.contains(tag) { afterDel.removeAll(tag) } if check(id: needUpdateId) { let filterRow = starReposTable.filter(repoId == needUpdateId) _ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: afterDel))) } else { _ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert))) } } } } catch { print(error) } } // MARK: - 根据id删除repo static func delete(id: Int) { let query = starReposTable.filter(repoId == id) do { if try SQLManager.githubDb.run(query.delete()) > 0 { print("deleted id:\(id)") } else { print("not found id:\(id)") } } catch { print("delete failed: \(error)") } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStar+Update.swift ================================================ // // SQLStar+Update.swift // BeeFun // // Created by WengHengcong on 2018/2/1. // Copyright © 2018年 LuCi. All rights reserved. // import SQLite extension SQLStars { // MARK: - 插入整条repo数据 /// 插入一个repos数组 static func insert(repos: [ObjRepos]) { assert(!repos.isEmpty) do { try SQLManager.githubDb.transaction { for repo in repos { insert(repo: repo) } } } catch { } } /// 插入一个repos对象 static func insert(repo: ObjRepos) { do { assert(repo.id != nil ) assert(repo.owner?.id != nil) if check(id: repo.id!) { let filterRow = starReposTable.filter(repoId == repo.id!) _ = try SQLManager.githubDb.run(filterRow.update(SQLStarReposSetters(repos: repo, action: .update))) // print("stars table updated id: \(repoId)") } else { _ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert))) // print("stars table inserted id: \(repoId)") } } catch { print("stars table insertion failed: \(error)") } } // MARK: - 针对所有Repos更新tag /// 针对所有Repos,从旧tag更新到新tag static func update(orginal from: ObjTag, change to: ObjTag) { do { let all = Array(try SQLManager.githubDb.prepare(starReposTable)) for item in all { let tags = SQLHelper.stringArray(blob: item[star_tags]) if tags.contains(from.name!) { let obj = convertObjRepos(item: item) let oriIndex = obj.star_tags!.index(of: from.name!) obj.star_tags![oriIndex!] = to.name! if let eachId = obj.id { if check(id: eachId) { let filterRow = starReposTable.filter(repoId == eachId) _ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: obj.star_tags))) } else { _ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: obj, action: .insert))) } } } } } catch { print(error) } } // MARK: - 针对单个repos更新tag /// 根据tag 字符串数组更新repos数据 static func update(repo: ObjRepos, tags: [String]) { if tags.isEmpty || repo.id == nil { return } do { if let needUpdateId = repo.id { if check(id: needUpdateId) { let filterRow = starReposTable.filter(repoId == needUpdateId) _ = try SQLManager.githubDb.run(filterRow.update(star_tags <- SQLHelper.SQLBlob(stringarray: tags))) } else { _ = try SQLManager.githubDb.run(starReposTable.insert(SQLStarReposSetters(repos: repo, action: .insert))) } } } catch { print(error) } } /// 根据tag对象类更新repos数据 static func update(repo: ObjRepos, tagObjs: [ObjTag]) { if tagObjs.isEmpty || repo.id == nil { return } var startags: [String] = [] for obj in tagObjs { startags.append(obj.name!) } self.update(repo: repo, tags: startags) } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars+Base.swift ================================================ // // SQLStars+Action.swift // BeeFun // // Created by WengHengcong on 04/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import SQLite extension SQLStars { // MARK: - 获取所有Star项目的语言 static func getLanguageList() -> [String] { var languageArr: [String] = [] do { let query = "SELECT DISTINCT language FROM \(starTableName) ORDER BY language ASC" let languageList = try SQLManager.githubDb.prepare(query) for item in languageList { let lan = item[0] as? String ?? "None" if languageArr.contains(lan) { continue } else { languageArr.append(lan) } } if languageArr.isEmpty { languageArr.append("Swift") } languageArr.sort { $0 < $1 } return languageArr } catch { return ["Swift"] } } // MARK: - 检查repos是否存在 static func check(id: Int) -> Bool { let query = starReposTable.where(repoId == id) let all = try? SQLManager.githubDb.prepare(query) if all != nil { for item in all! where (id == item[repoId]) { return true } } return false } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars+Find.swift ================================================ // // SQLStars+Find.swift // BeeFun // // Created by WengHengcong on 2018/2/1. // Copyright © 2018年 LuCi. All rights reserved. // import SQLite enum StarOrderType: Int { case time = 0 case star = 1 case a_z = 2 } extension SQLStars { // MARK: - 粗粒度查询——根据是否打标签 /// 查找全部Star repos static func findAllStar() -> [ObjRepos]? { var reposArr: [ObjRepos] = [] do { let all = Array(try SQLManager.githubDb.prepare(starReposTable)) for item in all { let repo = convertObjRepos(item: item) reposArr.append(repo) } return reposArr } catch { print(error) return nil } } /// 查找全部untagged repos static func findUntaggedStar() -> [ObjRepos]? { var untaggedRepo: [ObjRepos] = [] do { let all = Array(try SQLManager.githubDb.prepare(starReposTable)) var obj: ObjRepos = ObjRepos() for item in all { obj = convertObjRepos(item: item) if let startags = obj.star_tags { if startags.isEmpty { untaggedRepo.append(obj) } } else { untaggedRepo.append(obj) } } return untaggedRepo } catch { print(error) return nil } } // MARK: - 细粒度查询——根据repos id查询 /// 根据id查找repos对象 static func find(id: Int) -> ObjRepos? { let query = starReposTable.where(repoId == id) let all = try? SQLManager.githubDb.prepare(query) var obj: ObjRepos = ObjRepos() if all != nil { for item in all! { obj = convertObjRepos(item: item) return obj } } return nil } // MARK: - 综合查询 /// 根据编程员以及排序查询repos /// /// - Parameters: /// - lang: 编程语言 /// - order: 排序 static func find(lang: String, order: StarOrderType) -> [ObjRepos]? { var reposArr: [ObjRepos] = [] var obj: ObjRepos = ObjRepos() var myFilter = Expression(value: true) if lang == "All" { } else { myFilter = myFilter && (language == lang) } var query = starReposTable.filter(myFilter) switch order { case .time: query = starReposTable.filter(myFilter).order(starred_at.desc) case .star: query = starReposTable.filter(myFilter).order(stargazers_count.desc) case .a_z: query = starReposTable.filter(myFilter).order(name.asc) } let all = try? SQLManager.githubDb.prepare(query) if all != nil { for item in all! { obj = convertObjRepos(item: item) reposArr.append(obj) } } return reposArr } /// 查询 /// /// - Parameters: /// - lang: 编程语言 /// - order: 排序 /// - tags: 标签 /// - all: 是否在全部repos中查询 /// - untagged: 是否在全部未有标签中查询 static func find(lang: String, order: StarOrderType, tags: [ObjTag], all: Bool, untagged: Bool) -> [ObjRepos]? { var reposArr: [ObjRepos] = [] var objRepo: ObjRepos = ObjRepos() var tagString: [String] = [] if !tags.isEmpty { for tag in tags { tagString.append(tag.name!) } } var myFilter = Expression(value: true) if lang == "All" { } else { myFilter = myFilter && (language == lang) } var query = starReposTable.filter(myFilter) switch order { case .time: query = starReposTable.filter(myFilter).order(starred_at.desc) case .star: query = starReposTable.filter(myFilter).order(stargazers_count.desc) case .a_z: query = starReposTable.filter(myFilter).order(name.asc) } let allRepo = try? SQLManager.githubDb.prepare(query) if allRepo != nil { for item in allRepo! { objRepo = convertObjRepos(item: item) if untagged { //未标记 if let startags = objRepo.star_tags { if startags.isEmpty { reposArr.append(objRepo) } } else { reposArr.append(objRepo) } } else if all { //全部 reposArr.append(objRepo) } else { //某几个tag下 if tags.count == 0 { reposArr.append(objRepo) } else { let startags = SQLHelper.stringArray(blob: item[star_tags]) for tagsFromRepo in startags { if tagString.contains(tagsFromRepo) { reposArr.append(objRepo) } } } } } } return reposArr } // MARK: - 根据Tag查询 /// 查找tag下的所有repos static func findStarRepos(tag: ObjTag) -> [ObjRepos]? { var reposArr: [ObjRepos] = [] do { let all = Array(try SQLManager.githubDb.prepare(starReposTable)) for item in all { let tags = SQLHelper.stringArray(blob: item[star_tags]) if tags.contains(tag.name!) { let obj = convertObjRepos(item: item) reposArr.append(obj) } } return reposArr } catch { print(error) return nil } } /// 查找tags下的所有repos static func findStarRepos(tags: [ObjTag]) -> [ObjRepos]? { assert(!tags.isEmpty) var reposArr: [ObjRepos] = [] var tagString: [String] = [] for tag in tags { tagString.append(tag.name!) } do { let all = Array(try SQLManager.githubDb.prepare(starReposTable)) for item in all { let tags = SQLHelper.stringArray(blob: item[star_tags]) if tags.contains(tagString) { let obj = convertObjRepos(item: item) reposArr.append(obj) } } return reposArr } catch { print(error) return nil } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLStars.swift ================================================ // // SQLManagerStars.swift // BeeFun // // Created by WengHengcong on 22/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import SQLite class SQLStars: NSObject { static var retryCount: Int = 0 /// 表格相关 static let starTableName = "star_repos" internal static let starReposTable = Table(starTableName) // MARK: - 字段 internal static let archive_url = Expression("archive_url") internal static let assignees_url = Expression("assignees_url") internal static let blobs_url = Expression("blobs_url") internal static let branches_url = Expression("branches_url") internal static let clone_url = Expression("clone_url") internal static let collaborators_url = Expression("collaborators_url") internal static let comments_url = Expression("comments_url") internal static let commits_url = Expression("commits_url") internal static let compare_url = Expression("compare_url") internal static let contents_url = Expression("contents_url") internal static let contributors_url = Expression("contributors_url") internal static let created_at = Expression("created_at") internal static let default_branch = Expression("default_branch") internal static let deployments_url = Expression("deployments_url") internal static let description = Expression("description") internal static let downloads_url = Expression("downloads_url") internal static let events_url = Expression("events_url") internal static let fork = Expression("fork") internal static let forks = Expression("forks") internal static let forks_count = Expression("forks_count") internal static let forks_url = Expression("forks_url") internal static let full_name = Expression("full_name") internal static let git_commits_url = Expression("git_commits_url") internal static let git_refs_url = Expression("git_refs_url") internal static let git_tags_url = Expression("git_tags_url") internal static let git_url = Expression("git_url") internal static let has_downloads = Expression("has_downloads") internal static let has_projects = Expression("has_projects") internal static let has_issues = Expression("has_issues") internal static let has_pages = Expression("has_pages") internal static let has_wiki = Expression("has_wiki") internal static let homepage = Expression("homepage") internal static let hooks_url = Expression("hooks_url") internal static let html_url = Expression("html_url") internal static let repoId = Expression("id") internal static let issue_comment_url = Expression("issue_comment_url") internal static let issue_events_url = Expression("issue_events_url") internal static let issues_url = Expression("issues_url") internal static let keys_url = Expression("keys_url") internal static let labels_url = Expression("labels_url") internal static let language = Expression("language") internal static let languages_url = Expression("languages_url") internal static let merges_url = Expression("merges_url") internal static let milestones_url = Expression("milestones_url") internal static let mirror_url = Expression("mirror_url") internal static let name = Expression("name") internal static let notifications_url = Expression("notifications_url") internal static let open_issues = Expression("open_issues") internal static let open_issues_count = Expression("open_issues_count") /// owner id去追踪owner(ObjUser) internal static let owner = Expression("owner") internal static let owner_login = Expression("owner_login") internal static let owner_avatar_url = Expression("owner_avatar_url") //ObjPermissions internal static let permissions = Expression("permissions") internal static let cprivate = Expression("private")//private同关键字冲突,加c前缀 internal static let pulls_url = Expression("pulls_url") internal static let pushed_at = Expression("pushed_at") internal static let releases_url = Expression("releases_url") internal static let size = Expression("size") internal static let ssh_url = Expression("ssh_url") internal static let stargazers_count = Expression("stargazers_count") internal static let stargazers_url = Expression("stargazers_url") internal static let statuses_url = Expression("statuses_url") internal static let subscribers_url = Expression("subscribers_url") internal static let subscription_url = Expression("subscription_url") internal static let svn_url = Expression("svn_url") internal static let tags_url = Expression("tags_url") internal static let teams_url = Expression("teams_url") internal static let trees_url = Expression("trees_url") internal static let updated_at = Expression("updated_at") internal static let url = Expression("url") internal static let watchers = Expression("watchers") internal static let watchers_count = Expression("watchers_count") internal static let subscribers_count = Expression("subscribers_count") //以下字段为单独增加 internal static let star_tags = Expression("star_tags") internal static let star_lists = Expression("star_lists") internal static let watched = Expression("watched") internal static let starred = Expression("starred") internal static let starred_at = Expression("starred_at") } // MARK: - 创建表格 extension SQLStars { /// 创建Star Repos static func crateStarReposTable() { if retryCount > 3 { return } do { try SQLManager.githubDb.run(starReposTable.create(ifNotExists: true) { (t) in t.column(repoId, primaryKey: true) t.column(archive_url) t.column(assignees_url) t.column(blobs_url) t.column(branches_url) t.column(clone_url) t.column(collaborators_url) t.column(comments_url) t.column(commits_url) t.column(compare_url) t.column(contents_url) t.column(contributors_url) t.column(created_at) t.column(default_branch) t.column(deployments_url) t.column(description) t.column(downloads_url) t.column(events_url) t.column(fork) t.column(forks) t.column(forks_count) t.column(forks_url) t.column(full_name) t.column(git_commits_url) t.column(git_refs_url) t.column(git_tags_url) t.column(git_url) t.column(has_downloads) t.column(has_projects) t.column(has_issues) t.column(has_pages) t.column(has_wiki) t.column(homepage) t.column(hooks_url) t.column(html_url) t.column(issue_comment_url) t.column(issue_events_url) t.column(issues_url) t.column(keys_url) t.column(labels_url) t.column(language) t.column(languages_url) t.column(merges_url) t.column(milestones_url) t.column(mirror_url) t.column(name) t.column(notifications_url) t.column(open_issues) t.column(open_issues_count) t.column(owner) t.column(owner_login) t.column(owner_avatar_url) t.column(permissions) t.column(cprivate) t.column(pulls_url) t.column(pushed_at) t.column(releases_url) t.column(size) t.column(ssh_url) t.column(stargazers_count) t.column(stargazers_url) t.column(statuses_url) t.column(subscribers_url) t.column(subscription_url) t.column(svn_url) t.column(tags_url) t.column(teams_url) t.column(trees_url) t.column(updated_at) t.column(url) t.column(watchers) t.column(watchers_count) t.column(subscribers_count) t.column(star_tags) t.column(star_lists) t.column(starred) t.column(watched) t.column(starred_at) }) /// 新增starred_at列,注意以后新增需要升级 let existStarredAtColumn = try SQLManager.githubDb.exists(column: "starred_at", in: starTableName) if !existStarredAtColumn { try SQLManager.githubDb.run(starReposTable.addColumn(starred_at)) } } catch { retryCount += 1 crateStarReposTable() print(error) } } } // MARK: - 工具方法 extension SQLStars { static func convertObjRepos(item: Row) -> ObjRepos { let repo = ObjRepos() repo.id = item[repoId] repo.archive_url = item[archive_url] repo.assignees_url = item[assignees_url] repo.blobs_url = item[blobs_url] repo.branches_url = item[branches_url] repo.collaborators_url = item[collaborators_url] repo.comments_url = item[comments_url] repo.commits_url = item[commits_url] repo.compare_url = item[compare_url] repo.contents_url = item[contents_url] repo.contributors_url = item[contributors_url] repo.created_at = item[created_at] repo.default_branch = item[default_branch] repo.deployments_url = item[deployments_url] repo.cdescription = item[description] repo.downloads_url = item[downloads_url] repo.events_url = item[events_url] repo.fork = item[fork] repo.forks = item[forks] repo.forks_count = item[forks_count] repo.forks_url = item[forks_url] repo.full_name = item[full_name] repo.git_commits_url = item[git_commits_url] repo.git_refs_url = item[git_refs_url] repo.git_tags_url = item[git_tags_url] repo.git_url = item[git_url] repo.has_downloads = item[has_downloads] repo.has_projects = item[has_projects] repo.has_issues = item[has_issues] repo.has_pages = item[has_pages] repo.has_wiki = item[has_wiki] repo.homepage = item[homepage] repo.hooks_url = item[hooks_url] repo.html_url = item[html_url] repo.issue_comment_url = item[issue_comment_url] repo.issue_events_url = item[issue_events_url] repo.issues_url = item[issues_url] repo.keys_url = item[keys_url] repo.labels_url = item[labels_url] repo.language = item[language] repo.languages_url = item[languages_url] repo.merges_url = item[merges_url] repo.milestones_url = item[milestones_url] repo.mirror_url = item[mirror_url] repo.name = item[name] repo.notifications_url = item[notifications_url] repo.open_issues = item[open_issues] repo.open_issues_count = item[open_issues_count] let objOnwer = ObjUser() objOnwer.id = item[owner] objOnwer.login = item[owner_login] objOnwer.avatar_url = item[owner_avatar_url] repo.owner = objOnwer // repo.permissions = item[permissions] repo.cprivate = item[cprivate] repo.pulls_url = item[pulls_url] repo.pushed_at = item[pushed_at] repo.releases_url = item[releases_url] repo.size = item[size] repo.ssh_url = item[ssh_url] repo.stargazers_count = item[stargazers_count] repo.stargazers_url = item[stargazers_url] repo.statuses_url = item[statuses_url] repo.subscribers_url = item[subscribers_url] repo.subscription_url = item[subscription_url] repo.svn_url = item[svn_url] repo.tags_url = item[tags_url] repo.teams_url = item[teams_url] repo.trees_url = item[trees_url] repo.updated_at = item[updated_at] repo.url = item[url] repo.watchers = item[watchers] repo.watchers_count = item[watchers_count] repo.subscribers_count = item[subscribers_count] repo.star_tags = SQLHelper.stringArray(blob: item[star_tags]) repo.star_lists = SQLHelper.stringArray(blob: item[star_lists]) repo.watched = item[watched] repo.starred = item[starred] repo.starred_at = item[starred_at] return repo } static func SQLStarReposSetters(repos: ObjRepos, action: SQLiteAction) -> [SQLite.Setter] { var setters = [ archive_url <- repos.archive_url, assignees_url <- repos.assignees_url, blobs_url <- repos.blobs_url, branches_url <- repos.branches_url, clone_url <- repos.clone_url, collaborators_url <- repos.collaborators_url, comments_url <- repos.comments_url, commits_url <- repos.commits_url, compare_url <- repos.compare_url, contents_url <- repos.contents_url, contributors_url <- repos.contributors_url, created_at <- repos.created_at, default_branch <- repos.default_branch, deployments_url <- repos.deployments_url, description <- repos.cdescription, downloads_url <- repos.downloads_url, events_url <- repos.events_url, fork <- repos.fork, forks <- repos.forks, forks_count <- repos.forks_count, forks_url <- repos.forks_url, full_name <- repos.full_name, git_commits_url <- repos.git_commits_url, git_refs_url <- repos.git_refs_url, git_tags_url <- repos.git_tags_url, git_url <- repos.git_url, has_downloads <- repos.has_downloads, has_projects <- repos.has_projects, has_issues <- repos.has_issues, has_pages <- repos.has_pages, has_wiki <- repos.has_wiki, homepage <- repos.homepage, hooks_url <- repos.hooks_url, html_url <- repos.html_url, issue_comment_url <- repos.issue_comment_url, issue_events_url <- repos.issue_events_url, issues_url <- repos.issues_url, keys_url <- repos.keys_url, labels_url <- repos.labels_url, language <- repos.language, languages_url <- repos.languages_url, merges_url <- repos.merges_url, milestones_url <- repos.milestones_url, mirror_url <- repos.mirror_url, name <- repos.name, notifications_url <- repos.notifications_url, open_issues <- repos.open_issues, open_issues_count <- repos.open_issues_count, owner <- repos.owner!.id!, owner_login <- repos.owner!.login, owner_avatar_url <- repos.owner?.avatar_url, cprivate <- repos.cprivate, pulls_url <- repos.pulls_url, pushed_at <- repos.pushed_at, releases_url <- repos.releases_url, size <- repos.size, ssh_url <- repos.ssh_url, stargazers_count <- repos.stargazers_count, stargazers_url <- repos.stargazers_url, statuses_url <- repos.statuses_url, subscribers_url <- repos.subscribers_url, subscription_url <- repos.subscription_url, svn_url <- repos.svn_url, tags_url <- repos.tags_url, teams_url <- repos.teams_url, trees_url <- repos.trees_url, updated_at <- repos.updated_at, url <- repos.url, watchers <- repos.watchers, watchers_count <- repos.watchers_count, subscribers_count <- repos.subscribers_count, starred_at <- repos.starred_at ] let idSetter: SQLite.Setter = repoId <- repos.id! //以下自增的字段均通过不同手段更新 let watchedSetter: SQLite.Setter = watched <- repos.watched let starredSetter: SQLite.Setter = starred <- repos.starred let startagsSetter: SQLite.Setter = star_tags <- SQLHelper.SQLBlob(stringarray: repos.star_tags) let starlistSetter: SQLite.Setter = star_lists <- SQLHelper.SQLBlob(stringarray: repos.star_lists) switch action { case .insert: setters.append(idSetter) setters.append(watchedSetter) setters.append(starredSetter) setters.append(starlistSetter) setters.append(startagsSetter) default: break } return setters } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Manager/SQLTags.swift ================================================ // // SQLTags.swift // BeeFun // // Created by WengHengcong on 02/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import SQLite class SQLTags { static var retryCount: Int = 0 static let starTagsName = "star_tags" fileprivate static let starTagsTable = Table(starTagsName) // MARK: - 字段 /// name为唯一字段,不可重复,区分大小写 fileprivate static let nameId = Expression("name") /// 该tag下对应多少个repos fileprivate static let count = Expression("count") /// 该tag下对应的repos,集合中为reposid fileprivate static let star_repos = Expression("repos") /// order fileprivate static let tag_order = Expression("tag_order") } extension SQLTags { /// 创建Star Repos static func crateStarTagsTable() { if retryCount > 3 { return } do { try SQLManager.githubDb.run(starTagsTable.create(ifNotExists: true) { (t) in t.column(nameId, primaryKey: true) t.column(count) t.column(star_repos) t.column(tag_order) }) } catch { retryCount += 1 crateStarTagsTable() print(error) } } } // MARK: - 增/改 extension SQLTags { /// 插入一个repos对象 static func insert(tag: ObjTag) { do { if check(name: tag.name!) { let filterRow = starTagsTable.filter(nameId == tag.name!) let rowid = try SQLManager.githubDb.run(filterRow.update([ count <- tag.count, tag_order <- tag.sort, // star_repos <- SQLHelper.SQLBlob(intarray: tag.repos) ])) print("tag updated id: \(rowid)") } else { let rowid = try SQLManager.githubDb.run(starTagsTable.insert([ nameId <- tag.name!, count <- tag.count, tag_order <- tag.sort, // star_repos <- SQLHelper.SQLBlob(intarray: tag.repos!) ])) print("tag inserted id: \(rowid)") } } catch { print("tag insertion failed: \(error)") } } /// 重命名tag static func rename(oriTag: ObjTag, newTag: ObjTag) { do { try SQLManager.githubDb.transaction { delete(tag: oriTag) insert(tag: newTag) } } catch { } } } // MARK: - 检查tags是否存在 extension SQLTags { /// 检查该id是否已经存在 static func check(name: String) -> Bool { let query = starTagsTable.where(name == nameId) let all = try? SQLManager.githubDb.prepare(query) if all != nil { for item in all! where (name == item[nameId]) { return true } } return false } } // MARK: - 查询 extension SQLTags { /// 根据顺序查找tags /// /// - Parameters: /// - order: 顺序 static func findAll(order: SQLOrder) -> [ObjTag]? { let query = starTagsTable.order((order == .asc ? tag_order.asc : tag_order.desc)) var tagsArr: [ObjTag] = [] do { let all = Array(try SQLManager.githubDb.prepare(query)) for item in all { let tag = convertObjTags(item: item) tagsArr.append(tag) } return tagsArr } catch { print(error) return nil } } /// 查找全部tags static func findAll() -> [ObjTag]? { var tagsArr: [ObjTag] = [] do { let all = Array(try SQLManager.githubDb.prepare(starTagsTable)) for item in all { let tag = convertObjTags(item: item) tagsArr.append(tag) } return tagsArr } catch { print(error) return nil } } /// 查找全部tags,并获取字符串 static func findAllByString() -> [String] { var tags: [String] = [] if let all = findAll() { for item in all { tags.append(item.name!) } } return tags } /// 根据id查找repos对象 static func find(name: String) -> ObjTag { let query = starTagsTable.where(nameId == name) let all = try? SQLManager.githubDb.prepare(query) var obj: ObjTag = ObjTag() if all != nil { for item in all! { obj = convertObjTags(item: item) } } return obj } static func convertObjTags(item: Row) -> ObjTag { let tag = ObjTag() tag.name = item[nameId] tag.count = item[count] tag.sort = item[tag_order] // tag.repos = SQLHelper.intArray(blob: item[star_repos]) return tag } } // MARK: - 删 extension SQLTags { static func delete(name: String) { let query = starTagsTable.filter(name == nameId) do { if try SQLManager.githubDb.run(query.delete()) > 0 { print("deleted tag id:\(name)") } else { print("not found tag id:\(name)") } } catch { print("delete tag failed: \(error)") } } static func delete(tag: ObjTag) { let query = starTagsTable.filter(tag.name! == nameId) do { if try SQLManager.githubDb.run(query.delete()) > 0 { print("deleted tag id:\(tag.name)") } else { print("not found tag id:\(tag.name)") } } catch { print("delete tag failed: \(error)") } } } ================================================ FILE: BeeFun/BeeFun/SystemManager/Storage/Model/ObjList.swift ================================================ // // ObjStarList.swift // BeeFun // // Created by WengHengcong on 23/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class ObjList: NSObject { } ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBBaseUser.h ================================================ // // IMOBBaseUser.h // MOBFoundation // // Created by 冯鸿杰 on 2017/9/5. // Copyright © 2017年 MOB. All rights reserved. // #import #import "IMOBFDataModel.h" /** 基础用户信息 */ @protocol IMOBBaseUser /** 获取用户ID @return 用户ID */ - (NSString *)uid; /** 获取用户头像 @return 头像 */ - (NSString *)avatar; /** 获取用户昵称 @return 昵称 */ - (NSString *)nickname; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBFDataModel.h ================================================ // // IJIMDataModel.h // Jimu // // Created by 冯鸿杰 on 17/2/10. // Copyright © 2017年 Mob. All rights reserved. // #import /** 数据模型协议 */ @protocol IMOBFDataModel /** 初始化数据模型 @param dict 初始化数据 @return 数据模型 */ - (instancetype)initWithDict:(NSDictionary *)dict; /** 设置数据 @param data 数据 @param key 名称 */ - (void)set:(id)data key:(NSString *)key; /** 获取数据 @param key 名称 */ - (id)get:(NSString *)key; /** 返回一个字典结构 @return 字段数据对象 */ - (NSDictionary *)dictionaryValue; /** 返回字段映射字典 说明:类如果实现此方法,并返回映射字典,在使用initWithDict初始化时,则会按照映射查找属性;key 为真正想要设定的、存在的属性 ,value为需要映射的字段 @return 字段映射字典 */ - (NSDictionary *)mappingDictionary; /** 当类中有属性为数组,且数组元素同为MOBFDataModel时,应该置制定该属性属性及其元素类型 例如有 @property NSArray *array; 应主动实现本方法,并返回 @{@"array" : @"OtherDataModel"} @return 映射配置 */ - (NSDictionary *)confirmArrayElementType; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/IMOBFPlugin.h ================================================ // // IMOBFPlugin.h // MOBFoundation // // Created by fenghj on 15/6/2. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 插件协议 */ @protocol IMOBFPlugin @required /** * 插件加载时调用 * * @param key 插件标识 */ - (void)load:(NSString *)key; /** * 插件卸载时调用 */ - (void)unload; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFApplication.h ================================================ // // MOBFApplicationUtils.h // MOBFoundation // // Created by vimfung on 15-1-20. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 应用工具类 */ @interface MOBFApplication : NSObject /** * 获取应用名称 * * @return 应用名称 */ + (NSString *)name; /** * 获取应用包名 * * @return 包名 */ + (NSString *)bundleId; /** * 获取应用编译版本 * * @return 编译版本 */ + (NSString *)buildVersion; /** * 获取应用版本号 * * @return 应用版本号 */ + (NSString *)shortVersion; /** * 获取应用版本号 * * @return 版本号 */ + (NSString *)version __deprecated_msg("use [buildVersion] method instead"); /** * 检测是否启用ATS功能 */ + (BOOL)enabledATS; /** * 获取应用运行经过的时间(单位:毫秒) * * @return 经过时间 */ + (uint64_t)elapsedTime; /** * 判断链接是否能打开 * * @param url 链接 * * @return YES 可以打开,NO 不能打开 */ + (BOOL)canOpenUrl:(NSURL *)url; /** * 打开链接 * * @param url 链接 */ + (void)openUrl:(NSURL *)url; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFColor.h ================================================ // // MOBFColorUtils.h // MOBFoundation // // Created by vimfung on 15-1-19. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import /** * 颜色工具类 */ @interface MOBFColor : NSObject /** * 获取颜色对象 * * @param rgb RGB颜色值 * * @return 颜色对象 */ + (UIColor *)colorWithRGB:(NSUInteger)rgb; /** * 获取颜色对象 * * @param argb ARGB颜色值 * * @return 颜色对象 */ + (UIColor *)colorWithARGB:(NSUInteger)argb; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFData.h ================================================ // // MOBFDataUtils.h // MOBFoundation // // Created by vimfung on 15-1-16. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import #import /** * 数据工具类 */ @interface MOBFData : NSObject /** * 使用HMAC-SHA1进行加密 * * @param data 原始数据 * @param key 密钥 * * @return 加密后数据 */ + (NSData *)hmacSha1Data:(NSData *)data forKey:(NSData *)key; /** 使用HMAC-MD5进行签名 @param data 原始数据 @param key 密钥 @return 加密后数据 */ + (NSData *)hmacMd5Data:(NSData *)data forKey:(NSData *)key; /** * 对数据进行MD5签名 * * @param data 原始数据 * * @return 签名后数据 */ + (NSData *)md5Data:(NSData *)data; /** * 对数据进行AES128加密 * * @param data 原始数据 * @param key 密钥 * @param encoding 字符串编码 * * @return 加密后数据 */ + (NSData *)aes128EncryptData:(NSData *)data key:(NSString *)key encoding:(NSStringEncoding)encoding; /** * 对数据进行AES128解密 * * @param data 原始数据 * @param key 密钥 * @param encoding 字符串编码 * * @return 解密后数据 */ + (NSData *)aes128DecryptData:(NSData *)data key:(NSString *)key encoding:(NSStringEncoding)encoding; /** * 对数据进行AES128加密 * * @param data 原始数据 * @param key 密钥 * @param options 选项 * * @return 加密后数据 */ + (NSData *)aes128EncryptData:(NSData *)data key:(NSData *)key options:(CCOptions)options; /** * 对数据进行AES128解密 * * @param data 原始数据 * @param key 密钥 * @param options 选项 * * @return 解密后数据 */ + (NSData *)aes128DecryptData:(NSData *)data key:(NSData *)key options:(CCOptions)options; /** * 使用GZip压缩数据 * * @param data 原始数据 * * @return 压缩后数据 */ + (NSData *)compressDataUsingGZip:(NSData *)data; /** * 使用GZip解压缩数据 * * @param data 原始数据 * * @return 解压缩后数据 */ + (NSData *)uncompressDataUsingGZip:(NSData *)data; /** * 对数据进行MD5签名 * * @param data 原始数据 * * @return 签名后字符串 */ + (NSString *)stringByMD5Data:(NSData *)data; /** * 使用BASE64编码数据 * * @param data 原始数据 * * @return 编码后字符串 */ + (NSString *)stringByBase64EncodeData:(NSData *)data; /** * 对数据进行CRC32校验 * * @param data 数据对象 * * @return 校验值 */ + (uLong)valueByCRC32Data:(NSData *)data; /** * 对数据进行CRC32检验 * * @param data 原始数据 * * @return 检验值 */ + (NSString *)stringByCRC32Data:(NSData *)data; /** * 将数据转换成16进制字符串 * * @param data 原始数据 * * @return 字符串 */ + (NSString *)hexStringByData:(NSData *)data; /** * 写入一个32位整数到数据对象中 * * @param value 整数值 * @param data 数据对象 */ + (void)writeInt32:(int32_t)value toData:(NSMutableData *)data; /** * 写入一个16位整数到数据对象中 * * @param value 整数值 * @param data 数据对象 */ + (void)writeInt16:(int16_t)value toData:(NSMutableData *)data; /** * 读取一个16位整数 * * @param data 数据对象 * @param offset 偏移位置 * * @return 短整型数据 */ + (int16_t)readInt16FromData:(NSData *)data offset:(NSInteger)offset; /** * 读取一个32位整数 * * @param data 数据对象 * @param offset 偏移位置 * * @return 整型数据 */ + (int32_t)readInt32FromData:(NSData *)data offset:(NSInteger)offset; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDataModel.h ================================================ // // MOBFDataModel.h // MOBFoundation // // Created by 冯鸿杰 on 17/2/15. // Copyright © 2017年 MOB. All rights reserved. // #import #import "IMOBFDataModel.h" /** 数据模型 */ @interface MOBFDataModel : NSObject /** 初始化数据模型 @param dict 初始化数据 @return 数据模型 */ - (instancetype)initWithDict:(NSDictionary *)dict; /** 设置数据 @param data 数据 @param key 名称 */ - (void)set:(id)data key:(NSString *)key; /** 获取数据 @param key 名称 */ - (id)get:(NSString *)key; /** 返回一个字典结构 @return 字段数据对象 */ - (NSDictionary *)dictionaryValue; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDataService.h ================================================ // // MOBFDataService.h // MOBFoundation // // Created by vimfung on 15-1-21. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 数据服务 */ @interface MOBFDataService : NSObject /** * 获取数据服务共享实例对象 * * @return 数据服务对象 */ + (MOBFDataService *)sharedInstance; /** * 设置共享数据 * * @param data 数据 * @param key 标识 */ - (void)setSharedData:(id)data forKey:(NSString *)key; /** * 获取共享数据 * * @param key 标识 * * @return 数据 */ - (id)sharedDataForKey:(NSString *)key; /** * 开始缓存数据事务 * * @param domain 数据域 */ - (void)beginCacheDataTransForDomain:(NSString *)domain; /** * 结束缓存数据事务 * * @param domain 数据域 */ - (void)endCacheDataTransForDomain:(NSString *)domain; /** * 设置缓存数据 * * @param data 数据 * @param key 标识 * @param domain 数据域 */ - (void)setCacheData:(id)data forKey:(NSString *)key domain:(NSString *)domain; /** * 获取缓存数据 * * @param key 标识 * @param domain 数据域 * * @return 数据 */ - (id)cacheDataForKey:(NSString *)key domain:(NSString *)domain; /** * 开始安全数据事务 */ - (void)beginSecureDataTrans; /** * 结束安全数据事务 */ - (void)endSecureDataTrans; /** * 设置安全数据 * * @param data 数据 * @param key 标识 */ - (void)setSecureData:(id)data forKey:(NSString *)key; /** * 获取安全数据 * * @param key 标识 * * @return 数据 */ - (id)secureDataForKey:(NSString *)key; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDate.h ================================================ // // MOBFDateUtils.h // MOBFoundation // // Created by vimfung on 15-1-19. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 时间工具类 */ @interface MOBFDate : NSObject /** * 获取时间的年份 * * @param date 时间 * * @return 年份 */ + (NSInteger)fullYearByDate:(NSDate *)date; /** * 获取时间的月份 * * @param date 时间 * * @return 月份 */ + (NSInteger)monthByDate:(NSDate *)date; /** * 获取时间的日期 * * @param date 时间 * * @return 日期部分 */ + (NSInteger)dayByDate:(NSDate *)date; /** * 获取时间的小时部分 * * @param date 时间 * * @return 小时部分 */ + (NSInteger)hourByDate:(NSDate *)date; /** * 获取时间的分钟部分 * * @param date 时间 * * @return 分钟部分 */ + (NSInteger)minuteByDate:(NSDate *)date; /** * 获取时间的秒部分 * * @param date 时间 * * @return 秒部分 */ + (NSInteger)secondByDate:(NSDate *)date; /** * 将时间转换为指定格式字符串 * * @param date 时间 * @param format 格式字符串 * * @return 转换后字符串 */ + (NSString *)stringByDate:(NSDate *)date withFormat:(NSString *)format; /** * 将字符串转换为时间对象 * * @param format 格式字符串 * @param dateString 日期时间字符串 * * @return 时间对象 */ + (NSDate *)dateWithFormat:(NSString *)format dateString:(NSString *)dateString; /** * 将字符串转换为时间对象 * * @param format 格式字符串 * @param dateString 日期时间字符串 * @param locale 本地化参数 * * @return 时间对象 */ + (NSDate *)dateWithFormat:(NSString *)format dateString:(NSString *)dateString locale:(NSLocale *)locale; /** * 创建日期时间对象 * * @param year 年份 * @param month 月份 * @param date 日期 * @param hour 小时 * @param minute 分钟 * @param second 秒 * * @return 日期时间对象 */ + (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month date:(NSInteger)date hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDebug.h ================================================ // // MOBFDebug.h // MOBFoundation // // Created by 冯 鸿杰 on 15/2/4. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 调试工具类 */ @interface MOBFDebug : NSObject /** * 输出调试日志 * * @param format 日志格式 * @param ... 日志参数 */ + (void)log:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); /** * 观察释放对象,指定类型的被释放对象会打印在Console中。 * * @param type 对象类型 */ + (void)watchDeallocObjectWithType:(Class)type; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFDevice.h ================================================ // // MOBFDeviceUtils.h // MOBFoundation // // Created by vimfung on 15-1-19. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import /** * 网络类型 */ typedef NS_ENUM(NSUInteger, MOBFNetworkType) { /** * 无网咯 */ MOBFNetworkTypeNone = 0, /** * 蜂窝网络 */ MOBFNetworkTypeCellular = 2, /** * WIFI */ MOBFNetworkTypeWifi = 1, /** * 2G网络 */ MOBFNetworkTypeCellular2G = 3, /** * 3G网络 */ MOBFNetworkTypeCellular3G = 4, /** * 4G网络 */ MOBFNetworkTypeCellular4G = 5, }; /** IP版本 - MOBFIPVersion4: IPv4 - MOBFIPVersion6: IPv6 */ typedef NS_ENUM(NSUInteger, MOBFIPVersion) { MOBFIPVersion4 = 0, MOBFIPVersion6 = 1, }; /** * 设备工具类 */ @interface MOBFDevice : NSObject /** * 获取网卡物理地址 * * @return 网卡物理地址 */ + (NSString *)macAddress; /** * 获取设备型号 * * @return 设备型号 */ + (NSString *)deviceModel; /** * 获取当前网络类型 * * @return 网络类型 */ + (MOBFNetworkType)currentNetworkType; /** * 获取手机运营商代码 * * @return 手机运营商代码 */ + (NSString *)carrier; /** * 获取手机运营商名称 * * @return 运营商名称 */ + (NSString *)carrierName; /** * 获取手机运营商国家码 * * @return 运营商国家码 */ + (NSString *)mobileCountryCode; /** * 获取手机运营商网络编号 * * @return 运营商网络编号 */ + (NSString *)mobileNetworkCode; /** * 与当前系统版本比较 * * @param other 需要对比的版本 * * @return < 0 低于指定版本; = 0 跟指定版本相同;> 0 高于指定版本 */ + (NSInteger)versionCompare:(NSString *)other; /** * 判断是否已经越狱 * * @return YES 已经越狱,NO 尚未越狱 */ + (BOOL)hasJailBroken; /** * 获取运行进程信息 * * @return 进程信息列表 */ + (NSArray *)runningProcesses; /** * 判断当前设备是否为iPad * * @return YES 是,NO 否 */ + (BOOL)isPad; /** * 获取设备唯一标识 * * @return 标识码 */ + (NSString *)duid; /** * 获取屏幕真实尺寸 * * @return 屏幕尺寸 */ + (CGSize)nativeScreenSize; /** * 获取无线局域网的服务集标识(WIFI名称) * * @return 服务集标识 */ + (NSString *)ssid; /** * 获取基础服务集标识(站点的MAC地址) * * @return 基础服务集标识 */ + (NSString *)bssid; /** * 获取当前语言 * * @return 语言描述 */ + (NSString *)currentLanguage; /** * 获取设备IP地址 * * @return IP地址 */ + (NSString *)ipAddress:(MOBFIPVersion)ver; /** * 获取开发商ID * * @return 开发商ID */ + (NSString *)idfv; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFHttpPostedFile.h ================================================ // // MOBHttpPostedFile.h // MOBFoundation // // Created by 冯 鸿杰 on 15/1/30. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * @brief HTTP上传文件 */ @interface MOBFHttpPostedFile : NSObject /** * @brief 文件名称 */ @property (nonatomic, copy) NSString *fileName; /** * @brief 内容类型 */ @property (nonatomic, copy) NSString *contentType; /** * @brief 文件数据 */ @property (nonatomic, retain) NSData *fileData; /** * @brief 内容传输编码 */ @property (nonatomic, copy) NSString *transferEncoding; /** * @brief 创建上传文件 * * @param fileName 文件名称 * @param data 文件数据 * @param contentType 内容类型 * @param transferEncoding 传输编码 * * @return 上传文件信息 */ + (MOBFHttpPostedFile *)httpPostedFileByFileName:(NSString *)fileName data:(NSData *)data contentType:(NSString *)contentType transferEncoding:(NSString *)transferEncoding; /** * @brief 创建上传文件 * * @param path 文件路径 * @param contentType 内容类型 * * @return 上传文件信息 */ + (MOBFHttpPostedFile *)httpPostedFileByPath:(NSString *)path contentType:(NSString *)contentType; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFHttpService.h ================================================ // // MOBFHttpService.h // MOBFoundation // // Created by vimfung on 15-1-20. // Copyright (c) 2015年 MOB. All rights reserved. // #import @class MOBFHttpService; /** * GET方式 */ extern NSString *const kMOBFHttpMethodGet; /** * POST方式 */ extern NSString *const kMOBFHttpMethodPost; /** * DELETE方式 */ extern NSString *const kMOBFHttpMethodDelete; /** * HEAD方式 */ extern NSString *const kMOBFHttpMethodHead; /** * HTTP返回事件 * * @param response 回复对象 * @param responseData 回复数据 */ typedef void(^MOBFHttpResultEvent) (NSHTTPURLResponse *response, NSData *responseData); /** * HTTP错误事件 * * @param error 错误信息 */ typedef void(^MOBFHttpFaultEvent) (NSError *error); /** * HTTP上传数据事件 * * @param totalBytes 总字节数 * @param loadedBytes 上传字节数据 */ typedef void(^MOBFHttpUploadProgressEvent) (int64_t totalBytes, int64_t loadedBytes); /** * HTTP下载数据事件 * * @param totalBytes 总字节数 * @param loadedBytes 上传字节数据 */ typedef void(^MOBFHttpDownloadProgressEvent) (int64_t totalBytes, int64_t loadedBytes); /** * HTTP服务类 */ @interface MOBFHttpService : NSObject /** * @brief 提交方式,默认为GET */ @property (nonatomic, copy) NSString *method; /** 超时时间 */ @property (nonatomic) NSTimeInterval timeout; /** * @brief 是否缓存回复对象,默认为YES */ @property (nonatomic) BOOL isCacheResponse; /** * 自动填充请求表单,默认为YES,如果为NO则表示使用自定义的方式发起请求。 */ @property (nonatomic) BOOL autoFillRequestForm; /** * 初始化HTTP服务 * * @param urlString URL地址字符串 * * @return HTTP服务对象 */ - (id)initWithURLString:(NSString *)urlString; /** * 初始化HTTP服务 * * @param URL URL地址对象 * * @return HTTP服务对象 */ - (id)initWithURL:(NSURL *)URL; /** * 初始化HTTP服务 * * @param request 请求对象 * * @return HTTP服务对象 */ - (id)initWithRequest:(NSURLRequest *)request; /** * 添加HTTP头 * * @param header 名称 * @param value 值 */ - (void)addHeader:(NSString *)header value:(NSString *)value; /** * 添加HTTP头集合 * * @param headers 头集合 */ - (void)addHeaders:(NSDictionary *)headers; /** * 添加参数 * * @param value 参数值 * @param key 参数名字 */ - (void)addParameter:(id)value forKey:(NSString *)key; /** * 添加多个参数 * * @param parameters 参数集合 */ - (void)addParameters:(NSDictionary *)parameters; /** * 添加上传文件参数 * * @param fileData 文件数据 * @param fileName 文件名称 * @param mimeType MIME类型 * @param transferEncoding 传输编码 * @param key 参数名字 */ - (void)addFileParameter:(NSData *)fileData fileName:(NSString *)fileName mimeType:(NSString *)mimeType transferEncoding:(NSString *)transferEncoding forKey:(NSString *)key; /** * 设置请求体数据,可以为NSData或者NSInputStream * * @param body 请求体数据 */ - (void)setBody:(id)body; /** * 发送请求 * * @param resultHandler 返回回调 * @param faultHandler 错误回调 * @param uploadProgressHandler 上传数据进度回调 */ - (void)sendRequestOnResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler; /** 发送请求 @param resultHandler 返回回调 @param faultHandler 错误回调 @param uploadProgressHandler 上传数据进度回调 @param downloadProgressHandler 下载数据进度回调 */ - (void)sendRequestOnResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler onDownloadProgress:(MOBFHttpDownloadProgressEvent)downloadProgressHandler; /** * 取消请求 */ - (void)cancelRequest; /** * 发送HTTP请求 * * @param urlString 请求地址 * @param method 请求方式 * @param parameters 请求参数 * @param headers 请求头集合 * @param resultHandler 返回回调 * @param faultHandler 错误回调 * @param uploadProgressHandler 上传数据进度回调 * * @return HTTP服务对象 */ + (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString method:(NSString *)method parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers onResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler; /** * 发送HTTP请求 * * @param urlString 请求地址 * @param method 请求方式 * @param parameters 请求参数 * @param headers 请求头集合 * @param timeout 请求超时 * @param resultHandler 返回回调 * @param faultHandler 错误回调 * @param uploadProgressHandler 上传数据进度回调 * * @return HTTP服务对象 */ + (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString method:(NSString *)method parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers timeout:(NSTimeInterval)timeout onResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler; /** * 发送HTTP请求 * * @param urlString 请求地址 * @param method 请求方式 * @param parameters 请求参数 * @param headers 请求头集合 * @param timeout 请求超时 * @param resultHandler 返回回调 * @param faultHandler 错误回调 * @param uploadProgressHandler 上传数据进度回调 * @param downloadProgressHandler 下载数据进度回调 * * @return HTTP服务对象 */ + (MOBFHttpService *)sendHttpRequestByURLString:(NSString *)urlString method:(NSString *)method parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers timeout:(NSTimeInterval)timeout onResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler onDownloadProgress:(MOBFHttpDownloadProgressEvent)downloadProgressHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImage.h ================================================ // // MOBFImageUtils.h // MOBFoundation // // Created by vimfung on 15-1-19. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import /** * 圆角类型 */ typedef NS_ENUM(NSUInteger, MOBFOvalType) { /** * 无圆角 */ MOBFOvalTypeNone = 0x00, /** * 左上角 */ MOBFOvalTypeLeftTop = 0x01, /** * 左下角 */ MOBFOvalTypeLeftBottom = 0x02, /** * 右上角 */ MOBFOvalTypeRightTop = 0x04, /** * 右下角 */ MOBFOvalTypeRightBottom = 0x08, /** * 全部 */ MOBFOvalTypeAll = MOBFOvalTypeLeftTop | MOBFOvalTypeLeftBottom | MOBFOvalTypeRightTop | MOBFOvalTypeRightBottom }; /** * 图像工具类 */ @interface MOBFImage : NSObject /** * 裁剪图片 * * @param image 原始图片 * @param rect 裁剪范围 * * @return 裁剪后图片 */ + (UIImage *)clipImage:(UIImage *)image withRect:(CGRect)rect; /** * 将图片边角裁剪为圆角 * * @param image 原始图片 * @param size 图像尺寸 * @param ovalWidth 圆角宽度 * @param ovalHeight 圆角高度 * @param ovalType 圆角类型 * * @return 裁剪后图像 */ + (UIImage *)roundRectImage:(UIImage *)image withSize:(CGSize)size ovalWidth:(CGFloat)ovalWidth ovalHeight:(CGFloat)ovalHeight ovalType:(MOBFOvalType)ovalType; /** * 等比缩放图片 * * @param image 原始图片 * @param size 缩放的图片尺寸 * * @return 缩放后图片 */ + (UIImage *)scaleImage:(UIImage *)image withSize:(CGSize)size; /** * 获取图片对象 * * @param name 图片名称 * @param bundle 资源包对象 * * @return 图片对象 */ + (UIImage *)imageName:(NSString *)name bundle:(NSBundle *)bundle; /** * 通过指定视图生成图片 * * @param view 视图对象 * * @return 图片对象 */ + (UIImage *)imageByView:(UIView *)view; /** * 通过制定视图生成图片 * * @param view 视图对象 * @param opaque 是否为不透明图片,YES,不透明,NO,透明 * * @return 图片对象 */ + (UIImage *)imageByView:(UIView *)view opaque:(BOOL)opaque; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageCachePolicy.h ================================================ // // MOBFImageCachePolicy.h // MOBFoundation // // Created by 冯鸿杰 on 2017/4/12. // Copyright © 2017年 MOB. All rights reserved. // #import #import "MOBFImageServiceTypeDef.h" @interface MOBFImageCachePolicy : NSObject /** 缓存名称,用于对不同的图片缓存划分到不同的缓存路径中,如果名称相同则缓存位置相同。 */ @property (nonatomic, copy) NSString *cacheName; /** 缓存处理回调,当有图片需要进行缓存时会先调用该方法 */ @property (nonatomic, strong) MOBFImageGetterCacheHandler cacheHandler; /** 获取默认的缓存策略 @return 缓存策略 */ + (instancetype)defaultCachePolicy; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageGetter.h ================================================ // // MOBFImageGetter.h // MOBFoundation // // Created by fenghj on 16/1/21. // Copyright © 2016年 MOB. All rights reserved. // #import "MOBFImageObserver.h" #import "MOBFImageServiceTypeDef.h" #import @class MOBFImageCachePolicy; /** * 图片获取器 */ @interface MOBFImageGetter : NSObject /** * 获取共享图片服务实例 * * @return 图片服务实例 */ + (instancetype)sharedInstance; /** 初始化图片服务实例 @param cachePolicy 缓存策略 @return 图片服务实例 */ - (instancetype)initWithCachePolicy:(MOBFImageCachePolicy *)cachePolicy; /** * 是否存在图片缓存 * * @param url 图片URL * * @return YES 表示图片已缓存,NO 图片未缓存 */ - (BOOL)existsImageCacheWithURL:(NSURL *)url; /** * 获取图片 * * @param url 图片路径 * @param resultHandler 返回事件 * * @return 服务观察者 */ - (MOBFImageObserver *)getImageWithURL:(NSURL *)url result:(MOBFImageGetterResultHandler)resultHandler; /** 获取图片数据 @param url 图片路径 @param resultHandler 返回事件 @return 服务观察者 */ - (MOBFImageObserver *)getImageDataWithURL:(NSURL *)url result:(MOBFImageDataGetterResultHandler)resultHandler; /** * 移除图片观察者 * * @param imageObserver 图片观察者 */ - (void)removeImageObserver:(MOBFImageObserver *)imageObserver; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageObserver.h ================================================ // // MOBFImageObserver.h // MOBFoundation // // Created by fenghj on 16/1/21. // Copyright © 2016年 MOB. All rights reserved. // #import /** * 图片观察者 */ @interface MOBFImageObserver : NSObject /** * 图片链接 */ @property (nonatomic, strong, readonly) NSURL *url; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFImageServiceTypeDef.h ================================================ // // MOBFImageServiceTypeDef.h // MOBFoundation // // Created by fenghj on 15/6/8. // Copyright (c) 2015年 MOB. All rights reserved. // #ifndef MOBFoundation_MOBFImageServiceTypeDef_h #define MOBFoundation_MOBFImageServiceTypeDef_h #import /** 图片缓存处理 @param image 图片对象 @param imageData 图片的数据 */ typedef NSData* (^MOBFImageGetterCacheHandler)(NSData *imageData); /** * 图片加载返回 * * @param image 图片对象 * @param error 错误信息 */ typedef void (^MOBFImageGetterResultHandler)(UIImage *image, NSError *error); /** * 图片加载返回 * * @param imageData 图片数据 * @param error 错误信息 */ typedef void (^MOBFImageDataGetterResultHandler)(NSData *imageData, NSError *error); #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSContext.h ================================================ // // MOBFJSContext.h // MOBFoundation // // Created by 冯 鸿杰 on 15/2/27. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import "MOBFJSTypeDefine.h" @class JSContext; /** * JavaScript上下文环境 */ @interface MOBFJSContext : NSObject /** * 获取默认的上下文环境 * * @return JS上下文环境 */ + (instancetype)defaultContext; /** 初始化 @param webview Web视图,如果传入视图带有委托处理,请在传入该参数前将委托设置,否则会导致Context无法正常工作。 @return JS上下文 */ - (instancetype)initWithWebView:(UIWebView *)webview; /** 初始化 @param context JS上下文 @return JS上下文 */ - (instancetype)initWithContext:(JSContext *)context; /** * 注册方法 * * @param name 方法名称 * @param block 方法执行 */ - (void)registerJSMethod:(NSString *)name block:(MOBFJSMethodIMP)block; /** * 调用方法 * * @param name 方法名称 * @param arguments 参数 * * @return 返回值 */ - (NSString *)callJSMethod:(NSString *)name arguments:(NSArray *)arguments; /** * 加载插件 * * @param path 插件脚本文件路径 * @param name 插件名称 */ - (void)loadPluginWithPath:(NSString *)path forName:(NSString *)name; /** * 加载插件 * * @param content 插件脚本内容 * @param name 插件名称 */ - (void)loadPlugin:(NSString *)content forName:(NSString *)name; /** * 执行脚本 * * @param script 脚本 */ - (void)runScript:(NSString *)script; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSMethod.h ================================================ // // MOBFJSMethod.h // MOBFoundation // // Created by 冯 鸿杰 on 15/2/27. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import "MOBFJSTypeDefine.h" /** * JS方法 */ @interface MOBFJSMethod : NSObject /** * 方法名称 */ @property (nonatomic, copy, readonly) NSString *name; /** * 方法实现 */ @property (nonatomic, strong, readonly) MOBFJSMethodIMP imp; /** * 初始化方法 * * @param name 方法名称 * @param imp 方法实现 * * @return 方法对象 */ - (id)initWithName:(NSString *)name imp:(MOBFJSMethodIMP)imp; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJSTypeDefine.h ================================================ // // MOBFJSTypeDefine.h // MOBFoundation // // Created by 冯 鸿杰 on 15/2/27. // Copyright (c) 2015年 MOB. All rights reserved. // #ifndef MOBFoundation_MOBFJSTypeDefine_h #define MOBFoundation_MOBFJSTypeDefine_h /** * JS方法实现 * * @param arguments 传入参数 */ typedef void(^MOBFJSMethodIMP) (NSArray *arguments); #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFJson.h ================================================ // // MOBFJson.h // MOBFoundation // // Created by vimfung on 15-1-20. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * JSON工具类 */ @interface MOBFJson : NSObject /** * 通过JSON字符串反序列化为对象 * * @param jsonString JSON字符串 * * @return 对象 */ + (id)objectFromJSONString:(NSString *)jsonString; /** * 通过JSON数据反序列化为对象 * * @param jsonData JSON数据 * * @return 对象 */ + (id)objectFromJSONData:(NSData *)jsonData; /** * 通过对象序列化为JSON字符串 * * @param object 对象 * * @return JSON字符串 */ + (NSString *)jsonStringFromObject:(id)object; /** * 通过对象序列化为JSON字符串 * * @param object 对象 * @param block 未解析类型回调 * * @return JSON字符串 */ + (NSString *)jsonStringFromObject:(id)object serializeUnsupportedClassesUsingBlock:(id(^)(id object))block; /** * 通过对象序列化为JSON数据 * * @param object 对象 * * @return JSON数据 */ + (NSData *)jsonDataFromObject:(id)object; /** * 通过对象序列化为JSON数据 * * @param object 对象 * @param block 未解析类型回调 * * @return JSON数据 */ + (NSData *)jsonDataFromObject:(id)object serializeUnsupportedClassesUsingBlock:(id(^)(id object))block; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFLogService.h ================================================ // // MOBFLogService.h // MOBFoundation // // Created by 冯鸿杰 on 17/2/16. // Copyright © 2017年 MOB. All rights reserved. // #import @class MOBFLogService; /** 日志服务协议 */ @protocol MOBFLogServiceDelegate /** 是否需要发送日志 @param logService 日志服务 @param logs 已有日志信息集合 @return YES 表示需要发送日志,NO 表示不需要发送日志 */ - (BOOL)logService:(MOBFLogService *)logService needsSendLogs:(NSArray *)logs; /** 发送日志 @param logService 日志服务 @param logs 需要发送的日志信息集合 @param result 发送完成回调,成功时传入YES,否则传入NO */ - (void)logService:(MOBFLogService *)logService didSendLogs:(NSArray *)logs result:(void (^)(BOOL succeed, NSArray *sentLogs))result; @end /** 日志服务 */ @interface MOBFLogService : NSObject /** 委托对象 */ @property (nonatomic, weak) id delegate; /** 失败最大重试次数 */ @property (nonatomic) NSInteger failRetryMaxCount; /** 初始化 @param name 日志服务名称 @return 日志服务对象 */ - (instancetype)initWithName:(NSString *)name; /** 初始化 @param name 日志服务名称 @param secretKey 密钥(AES) @return 日志服务对象 */ - (instancetype)initWithName:(NSString *)name secretKey:(NSString *)secretKey; /** 写入数据 @param data 日志数据 */ - (void)writeData:(id)data; /** 同步写入数据 @param data 日志数据 */ - (void)syncWriteData:(id)data; /** 需要发送日志,服务会对当前日志进行检测,如果发现存在日志会跟委托进行确认是否需要发送,然后再进行后续操作 */ - (void)needsSendLog; /** 需要发送日志,服务会对当前日志进行检测,如果发现存在日志会跟委托进行确认是否需要发送,然后再进行后续操作 @param time 延时检测时间 */ - (void)needsSendLogAfterTime:(NSTimeInterval)time; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFNotificationCenter.h ================================================ // // MOBFCore.h // MOBFoundation // // Created by fenghj on 15/8/31. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 应用程序崩溃通知 */ extern NSString *const MOBFApplicationCrashNotif; /** * 核心对象 */ @interface MOBFNotificationCenter : NSObject /** * 添加观察者 * * @param observer 观察者对象 * @param selector 处理器方法 * @param name 通知名称 * @param object 对象信息 */ + (void)addObserver:(NSObject *)observer selector:(SEL)selector name:(NSString *)name object:(id)object; /** * 移除观察者 * * @param observer 观察者对象 */ + (void)removeObserver:(NSObject *)observer; /** * 移除观察者 * * @param observer 观察者对象 * @param name 通知名称 * @param object 对象信息 */ + (void)removeObserver:(NSObject *)observer name:(NSString *)name object:(id)object; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFNumber.h ================================================ // // MOBFNumberUtils.h // MOBFoundation // // Created by vimfung on 15-1-20. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 数值工具类 */ @interface MOBFNumber : NSObject /** * 获取随机整型值 * * @param max 最大随机数 * * @return 随机整数 */ + (NSInteger)randomInteger:(NSInteger)max; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFOAuthService.h ================================================ // // MOBFOAuthService.h // MOBFoundation // // Created by fenghj on 15/6/9. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * OAuth服务 */ @interface MOBFOAuthService : MOBFHttpService /** * 设置密钥 * * @param consumerSecret 消费者密钥,不允许为nil * @param oauthTokenSecret 令牌密钥,如果尚未取得令牌密钥,可以传入nil */ - (void)setSecretByConsumerSecret:(NSString *)consumerSecret oauthTokenSecret:(NSString *)oauthTokenSecret; /** * 添加OAuth参数 * * @param value 参数值 * @param key 参数名字 */ - (void)addOAuthParameter:(id)value forKey:(NSString *)key; /** * 添加OAuth参数 * * @param oauthParameters OAuth参数集合 */ - (void)addOAuthParameters:(NSDictionary *)oauthParameters; /** * 发送HTTP请求 * * @param urlString 请求地址 * @param method 请求方式 * @param parameters 请求参数 * @param headers 请求头集合 * @param oauthParameters OAuth请求参数 * @param consumerSecret 消费者密钥 * @param oauthSecret OAuth令牌密钥 * @param resultHandler 返回回调 * @param faultHandler 错误回调 * @param uploadProgressHandler 上传数据进度回调 * * @return HTTP服务对象 */ + (MOBFOAuthService *)sendRequestByURLString:(NSString *)urlString method:(NSString *)method parameters:(NSDictionary *)parameters headers:(NSDictionary *)headers oauthParameters:(NSDictionary *)oauthParameters consumerSecret:(NSString *)consumerSecret oauthTokenSecret:(NSString *)oauthTokenSecret onResult:(MOBFHttpResultEvent)resultHandler onFault:(MOBFHttpFaultEvent)faultHandler onUploadProgress:(MOBFHttpUploadProgressEvent)uploadProgressHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFPluginManager.h ================================================ // // MOBFPluginManager.h // MOBFoundation // // Created by fenghj on 15/6/2. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import "IMOBFPlugin.h" /** * 插件创建事件处理 * * @return 插件对象 */ typedef id(^MOBFPluginConstructHandler) (); /** * 插件管理器 */ @interface MOBFPluginManager : NSObject /** * 获取默认的插件管理器 * * @return 插件管理器 */ + (instancetype) defaultManager; /** * 注册插件 * * @param pluginConstructHandler 插件构造事件处理器 * @param key 插件标识 * * @return YES 表示注册成功,NO 表示注册失败,有可能已存在此插件 */ - (BOOL)registerPlugin:(MOBFPluginConstructHandler)pluginConstructHandler forKey:(NSString *)key; /** * 判断是否已经注册插件 * * @param key 插件标识 * * @return YES 表示已经注册, NO 表示尚未注册 */ - (BOOL)isRegisterPluginForKey:(NSString *)key; /** * 获取插件对象 * * @param key 插件标识 * * @return 插件对象,nil 表示该标志的插件不存在 */ - (id)pluginForKey:(NSString *)key; /** * 卸载插件 * * @param key 插件标识 */ - (void)unloadPluginForKey:(NSString *)key; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRSAHelper.h ================================================ // // MOBFRSAHelper.h // MOBFoundation // // Created by fenghj on 15/7/29. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import "MOBFRSAKey.h" /** * RSA加解密助手 */ @interface MOBFRSAHelper : NSObject /** * 密钥信息 */ @property (nonatomic, readonly) MOBFRSAKey *key; /** * 初始化RSA加密器 * * @param keySize 密钥长度 * * @return 加密器对象 */ - (instancetype)initWithKeySize:(int)keySize; /** * 初始化RSA加密器 * * @param keySize 密钥长度 * @param publicKey 公钥 * @param privateKey 私钥 * @param modulus 模数 * * @return 加密器对象 */ - (instancetype)initWithKeySize:(int)keySize publicKey:(NSString *)publicKey privateKey:(NSString *)privateKey modulus:(NSString *)modulus; /** * 加密数据 * * @param data 数据 * * @return 加密后数据 */ - (NSData *)encryptWithData:(NSData *)data; /** * 解密数据 * * @param data 加密后数据 * * @return 解密后数据 */ - (NSData *)decryptWithData:(NSData *)data; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRSAKey.h ================================================ // // MOBFRSAKey.h // MOBFoundation // // Created by fenghj on 15/7/29. // Copyright (c) 2015年 MOB. All rights reserved. // #import @class MOBFBigInteger; @interface MOBFRSAKey : NSObject /** * bits in key */ @property (nonatomic) int bits; /** * modulus */ @property (nonatomic, strong) MOBFBigInteger *n; /** * public exponent */ @property (nonatomic, strong) MOBFBigInteger *e; /** * private exponent */ @property (nonatomic, strong) MOBFBigInteger *d; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFRegex.h ================================================ // // MOBFRegex.h // MOBFoundation // // Created by vimfung on 15-1-20. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 替换处理 * * @param captureCount 捕获数量 * @param capturedStrings 捕获字符串集合 * @param capturedRanges 捕获字符串范围集合 * @param stop 是否停止捕获标识 * * @return 替换后的字符串 */ typedef NSString *(^MOBFReplacingOccurrencesHandler) (NSInteger captureCount, NSString *const capturedStrings[captureCount], const NSRange capturedRanges[captureCount], volatile BOOL * const stop); /** 正则表达式选项 - MOBFRegexOptionsNoOptions: 无匹配 - MOBFRegexOptionsCaseless: 不区分字母大小写的模式 - MOBFRegexOptionsComments: 忽略掉正则表达式中的空格和#号之后的字符 - MOBFRegexOptionsIgnoreMetacharacters: 将正则表达式整体作为字符串处理 - MOBFRegexOptionsDotAll: 允许.匹配任何字符,包括换行符 - MOBFRegexOptionsMultiline: 允许^和$符号匹配整段文本的开头和结尾 - MOBFRegexOptionsUseUnixLineSeparators: 设置\n为唯一的行分隔符,否则所有的都有效。 - MOBFRegexOptionsUnicodeWordBoundaries: 使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效 */ typedef NS_ENUM(NSUInteger, MOBFRegexOptions) { MOBFRegexOptionsNoOptions = 0, MOBFRegexOptionsCaseless = 1 << 0, MOBFRegexOptionsComments = 1 << 1, MOBFRegexOptionsIgnoreMetacharacters = 1 << 2, MOBFRegexOptionsDotAll = 1 << 3, MOBFRegexOptionsMultiline = 1 << 4, MOBFRegexOptionsUseUnixLineSeparators = 1 << 5, MOBFRegexOptionsUnicodeWordBoundaries = 1 << 6, }; /** * 正则表达式工具类 */ @interface MOBFRegex : NSObject /** * 替换字符串 * * @param regex 正则表达式 * @param string 原始字符串 * @param block 块回调处理替换规则 * * @return 字符串 */ + (NSString *)stringByReplacingOccurrencesOfRegex:(NSString *)regex withString:(NSString *)string usingBlock:(MOBFReplacingOccurrencesHandler)block; /** * 匹配字符串 * * @param regex 正则表达式 * @param options 表达式选项 * @param range 匹配范围 * @param string 原始字符串 * * @return YES 匹配,NO 不匹配 */ + (BOOL)isMatchedByRegex:(NSString *)regex options:(MOBFRegexOptions)options inRange:(NSRange)range withString:(NSString *)string; /** * 匹配字符串 * * @param regex 正则表达式 * @param string 原始字符串 * * @return 匹配的字符串集合 */ + (NSArray *)captureComponentsMatchedByRegex:(NSString *)regex withString:(NSString *)string; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFString.h ================================================ // // MOBFStringUtils.h // MOBFoundation // // Created by vimfung on 15-1-16. // Copyright (c) 2015年 MOB. All rights reserved. // #import /** * 字符串工具 */ @interface MOBFString : NSObject /** * URL编码 * * @param string 原始字符串 * @param encoding 字符串编码 * * @return 编码后字符串 */ + (NSString *)urlEncodeString:(NSString *)string forEncoding:(NSStringEncoding)encoding; /** * URL解码 * * @param string 原始字符串 * @param encoding 字符串编码 * * @return 解码后字符串 */ + (NSString *)urlDecodeString:(NSString *)string forEncoding:(NSStringEncoding)encoding; /** * 使用SHA1算法进行字符串签名 * * @param string 原始字符串 * * @return 签名后字符串 */ + (NSString *)sha1String:(NSString *)string; /** * 使用MD5算法进行字符串签名 * * @param string 原始字符串 * * @return 签名后字符串 */ + (NSString *)md5String:(NSString *)string; /** * 获取GUID字符串 * * @return GUID字符串 */ + (NSString *)guidString; /** * 使用HMAC-SHA1进行签名 * * @param string 原始字符串 * @param key 密钥 * * @return 签名后的数据 */ + (NSData *)dataByHMACSha1String:(NSString *)string forKey:(NSString *)key; /** 使用HMAC-MD5进行签名 @param string 原始字符串 @param key 密钥 @return 签名后的数据 */ + (NSData *)dataByHMACMd5String:(NSString *)string forKey:(NSString *)key; /** * 使用BASE64进行解码 * * @param string 原始字符串 * * @return 解码后数据 */ + (NSData *)dataByBase64DecodeString:(NSString *)string; /** * 判断字符串中是否包含链接 * * @param string 原始字符串 * * @return YES 表示包含URL,NO 表示不包含 */ + (BOOL)containsURLByString:(NSString *)string; /** * @brief 解析HTTP参数字符串,字符串格式为:参数名=参数值&参数名=参数值 * * @param string 参数字符串 * * @return 解析后字典对象 */ + (NSDictionary *)parseURLParametersString:(NSString *)string; /** * @brief 转换16进制字符串为NSData * * @param string 二进制流的16进制字符串 * * @return 二进制数据对象 */ + (NSData *)dataByHexString:(NSString *)string; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFUser.h ================================================ // // MOBFUser.h // MOBFoundation // // Created by 冯鸿杰 on 17/3/17. // Copyright © 2017年 MOB. All rights reserved. // #import #import "IMOBBaseUser.h" #import "MOBFDataModel.h" /** 用户信息 */ @interface MOBFUser : MOBFDataModel /** 用户标识 */ @property (nonatomic, copy, readonly, nullable) NSString * uid; /** 应用的用户标识 */ @property (nonatomic, copy, readonly, nullable) NSString * appUid; /** 用户头像 */ @property (nonatomic, copy, nullable) NSString * avatar; /** 用户昵称 */ @property (nonatomic, copy, nullable) NSString * nickname; /** 用户自定义数据 */ @property (nonatomic, strong, nullable) NSDictionary * userdata; /** 创建第三方用户信息 @param uid 用户标识,能够表示你的用户唯一性的标识 @param avatar 用户头像地址 @param nickname 用户名称 @return 用户信息 */ + (MOBFUser* _Nullable)userWithUid:(NSString * _Nonnull)uid avatar:(NSString * _Nullable)avatar nickname:(NSString * _Nullable)nickname __deprecated_msg("use userWithAppUid:avatar:nickname:userData: method instead."); /** 创建第三方用户信息 @param appUid 用户标识,能够表示你的用户唯一性的标识 @param avatar 用户头像地址 @param nickname 用户名称 @param userdata 用户自定义数据 @return 用户信息 */ + (MOBFUser* _Nullable)userWithAppUid:(NSString * _Nonnull )appUid avatar:(NSString * _Nullable)avatar nickname:(NSString * _Nullable)nickname userdata:(NSDictionary * _Nullable)userdata; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFViewController.h ================================================ // // MOBFViewControllerUtils.h // MOBFoundation // // Created by vimfung on 15-1-19. // Copyright (c) 2015年 MOB. All rights reserved. // #import #import /** * 视图控制器工具类 */ @interface MOBFViewController : NSObject /** * 获取当前视图控制器 * * @return 视图控制器 */ + (UIViewController *)currentViewController; /** * 获取当前视图控制器 * * @param window 窗口 * * @return 视图控制器 */ + (UIViewController *)currentViewControllerFromWindow:(UIWindow *)window; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFXml.h ================================================ // // MOBFXml.h // MOBFoundation // // Created by fenghj on 15/9/16. // Copyright © 2015年 MOB. All rights reserved. // #import @class MOBFXmlNode; /** * XML工具类 */ @interface MOBFXml : NSObject /** * 根节点 */ @property (nonatomic, strong, readonly) MOBFXmlNode *rootNode; /** * 初始化XML实例对象 * * @param path XML文件路径 * * @return XML实例对象 */ - (instancetype)initWithPath:(NSString *)path; /** * 初始化XML实例对象 * * @param string XML字符串描述 * * @return XML实例对象 */ - (instancetype)initWithString:(NSString *)string; /** * 获取XML字典描述对象 * * @return 字典对象 */ - (NSDictionary *)dictionaryValue; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFXmlNode.h ================================================ // // MOBFXmlNode.h // MOBFoundation // // Created by fenghj on 15/9/17. // Copyright © 2015年 MOB. All rights reserved. // #import /** * XML节点 */ @interface MOBFXmlNode : NSObject /** * 父级节点 */ @property (nonatomic, weak) MOBFXmlNode *parentNode; /** * 节点名称 */ @property (nonatomic, copy) NSString *name; /** * 属性集合 */ @property (nonatomic, strong, readonly) NSMutableDictionary *attributes; /** * 子节点 */ @property (nonatomic, strong, readonly) NSMutableArray *children; /** * 文本信息 */ @property (nonatomic, copy) NSString *text; /** * 获取节点的字典结构描述 * * @return 字典结构 */ - (NSDictionary *)dictionaryValue; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MOBFoundation.h ================================================ // // MOBFoundation.h // MOBFoundation // // Created by vimfung on 15-1-16. // Copyright (c) 2015年 MOB. All rights reserved. // #ifndef MOBFoundation_MOBFoundation_h #define MOBFoundation_MOBFoundation_h #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/Headers/MobSDK.h ================================================ // // MobSDK.h // MOBFoundation // // Created by 冯鸿杰 on 17/2/23. // Copyright © 2017年 MOB. All rights reserved. // #import /** MobSDK */ @interface MobSDK : NSObject /** 获取版本号 @return 版本号 */ + (NSString * _Nonnull)version; /** 获取应用标识 @return 应用标识 */ + (NSString * _Nullable)appKey; /** 获取应用密钥 @return 应用密钥 */ + (NSString * _Nullable)appSecret; /** 变更应用密钥,针对服务器刷新应用密钥后,可以通过该方法进行修改 @param appSecret 应用密钥 */ + (void)changeAppSecret:(NSString * _Nonnull)appSecret; /** 注册appKey、appSecret @param appKey appKey @param appSecret appSecret */ + (void)registerAppKey:(NSString * _Nonnull)appKey appSecret:(NSString * _Nonnull)appSecret; #pragma mark - User /** 设置用户 @param uid 用户标识,对应应用自身用户系统的用户唯一标志,不一定是实际的用户ID,可以通过数据变换的方式(如:MD5(userID))来生成该ID,但一定要能够唯一标识用户。设置nil表示注销用户,解除绑定 @param nickname 昵称 @param avatar 头像 @param userData 用户自定义数据 */ + (void)setUserWithUid:(NSString * _Nullable)uid nickName:(NSString * _Nullable)nickname avatar:(NSString * _Nullable)avatar userData:(NSDictionary * _Nullable)userData; /** 清空用户 */ + (void)clearUser; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/MOBFoundation ================================================ [File too large to display: 11.1 MB] ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/Required/MOBFoundation.framework/readme ================================================ ========================================= MOBFoundation.framework ========================================= 1、引用此库需要添加下面依赖库: libz.tdb libstdc++.tdb ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFContentEntity.h ================================================ // // IMOBFContentEntity.h // ShareSDK // // Created by youzu on 2017/9/18. // Copyright © 2017年 掌淘科技. All rights reserved. // #import @protocol IMOBFContentEntity /** * 内容标识 */ @property (nonatomic, copy) NSString *cid; /** * 分享文本 */ @property (nonatomic, copy) NSString *text; /** * 分享图片列表,元素为SSDKImage */ @property (nonatomic, strong) NSArray *images; /** * 分享链接列表,元素为NSURL */ @property (nonatomic, strong) NSArray *urls; /** * 原始数据 */ @property (nonatomic, strong) NSDictionary *rawData; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFShareComponent.h ================================================ // // IMOBFShareComponent.h // MOBFoundation // // Created by 冯鸿杰 on 17/2/14. // Copyright © 2017年 MOB. All rights reserved. // #import #import @protocol IMOBFSocialUser; @protocol IMOBFContentEntity; /** 分享组件 */ @protocol IMOBFShareComponent /** * 分享平台授权 * * @param platformType 平台类型 * @param settings 授权设置,目前只接受SSDKAuthSettingKeyScopes属性设置,如新浪微博关注官方微博:@{SSDKAuthSettingKeyScopes : @[@"follow_app_official_microblog"]},类似“follow_app_official_microblog”这些字段是各个社交平台提供的。 * @param stateChangedHandler 授权状态变更回调处理 */ + (void)authorize:(NSInteger)platformType settings:(NSDictionary *)settings onStateChanged:(void (^) (NSInteger state, id user, NSError *error))stateChangedHandler; /** * 获取授权用户信息 * * @param platformType 平台类型 * @param stateChangedHandler 状态变更回调处理 */ + (void)getUserInfo:(NSInteger)platformType onStateChanged:(void (^) (NSInteger state, id user, NSError *error))stateChangedHandler; /** * 取消分享平台授权 * * @param platformType 平台类型 */ + (void)cancelAuthorize:(NSInteger)platformType; /** * 判断分享平台是否授权 * * @param platformTypem 平台类型 * @return YES 表示已授权,NO 表示尚未授权 */ + (BOOL)hasAuthorized:(NSInteger)platformTypem; /** * 分享内容 * * @param platformType 平台类型 * @param parameters 分享参数 * @param stateChangedHandler 状态变更回调处理 */ + (void)share:(NSInteger)platformType parameters:(NSMutableDictionary *)parameters onStateChanged:(void (^)(NSInteger state, NSDictionary *userData, id contentEntity, NSError *error))stateChangedHandler; @optional #pragma mark - share 参数设置 /** 设置分享参数 @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 dataDictionary 数据存储字典 如果传入nil将新建 */ + (NSMutableDictionary *)SSDKSetupShareParamsByText:(NSString *)text images:(id)images url:(NSURL *)url title:(NSString *)title type:(NSInteger)type dataDictionary:(NSMutableDictionary *)dataDictionary; /* 设置新浪微博分享参数 @param text 文本 @param title 标题 @param image 图片对象,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage @param url 分享链接 @param latitude 纬度 @param longitude 经度 @param objectID 对象ID,标识系统内内容唯一性,应传入系统中分享内容的唯一标识,没有时可以传入nil @param type 分享类型,仅支持Text、Image、WebPage 类型 设置 SSDKEnableSinaWeiboAPIShare 使用API进行分享 但text中需要附 安全域 安全域在新浪微博开放平台设置 @param dataDictionary 数据存储字典 如果传入nil将新建 */ + (NSMutableDictionary *)SSDKSetupSinaWeiboShareParamsByText:(NSString *)text title:(NSString *)title image:(id)image url:(NSURL *)url latitude:(double)latitude longitude:(double)longitude objectID:(NSString *)objectID type:(NSInteger)type dataDictionary:(NSMutableDictionary *)dataDictionary; /* 设置微信分享参数 @param text 文本 @param title 标题 @param url 分享链接 @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage @param musicFileURL 音乐文件链接地址 @param extInfo 扩展信息 @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage @param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage @param fileExtension 源文件后缀名 @param sourceFileData 源文件数据,可以为NSData、NSString、NSURL(文件路径)、SSDKData @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo @param platformSubType 平台子类型,只能传入其中一个 @param dataDictionary 数据存储字典 如果传入nil将新建 分享文本时: 设置type为SSDKContentTypeText, 并填入text参数 分享图片时: 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数 分享网页时: 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。 分享应用时: 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。 分享音乐时: 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。 分享视频时: 设置type为SSDKContentTypeVideo,并设置text、title、url参数 分享文件时: 设置type为SSDKContentTypeFile(例如.mp3、.mp4、.pdf、.docx的分享),设置title、sourceFileExtension、sourceFileData,以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作参数 */ + (NSMutableDictionary *)SSDKSetupWeChatParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url thumbImage:(id)thumbImage image:(id)image musicFileURL:(NSURL *)musicFileURL extInfo:(NSString *)extInfo fileData:(id)fileData emoticonData:(id)emoticonData sourceFileExtension:(NSString *)fileExtension sourceFileData:(id)sourceFileData type:(NSInteger)type forPlatformSubType:(NSInteger)platformSubType dataDictionary:(NSMutableDictionary *)dataDictionary; /* 设置QQ分享参数 @param text 分享内容 @param title 分享标题 @param url 分享链接(如果分享类型为音频/视频时,应该传入音频/视频的网络URL地址) [特别说明:分享视频到QZone时,视频为网络视频,请传入视频网络URL地址;视频为本地视频的,请传入来源于手机系统相册的相关的Asset URL地址] @param audioFlashURL 分享音频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Audio时生效 @param videoFlashURL 分享视频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Video时生效 @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage QQ会采用首张图片,QZone则支持图片数组 @param type 分享类型, 仅支持Text、Image、WebPage、Audio、Video类型 @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个 @param dataDictionary 数据存储字典 如果传入nil将新建 */ + (NSMutableDictionary *)SSDKSetupQQParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url audioFlashURL:(NSURL *)audioFlashURL videoFlashURL:(NSURL *)videoFlashURL thumbImage:(id)thumbImage images:(id)images type:(NSInteger)type forPlatformSubType:(NSInteger)platformSubType dataDictionary:(NSMutableDictionary *)dataDictionary; /** 设置Facebook分享参数 @param text 分享内容 分享类型为Text类型时,作为文字主体内容 分享类型为WebPage类型时,作为连接描述 @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage 分享类型为Image类型时,若使用客户端分享,可传入 单张/多张 的 本地/网络 图片;如果不使用客户端分享,仅支持单张的本地/网络图片 *【Facebook通过客户端分享图片,可不需依赖任何权限;否则需要申请publish_actions权限】* 分享类型为WebPage类型时,无论是否使用客户端,仅支持单张的网络图片 @param url 链接 分享类型为WebPage类型时,为链接地址 [如果分享的连接是AppStore/GooglePlay/Facebook个人/公共主页,所对应的图片,标题,描述等参数可能不会生效,而实际生效的是FB通过爬虫网络根据连接搜刮而来的信息] 分享类型为Video类型时,需传入视频地址且但必须是相册地址 @param title 链接标题 分享类型为WebPage类型时,为链接标题 @param urlName 连接名称 分享类型为WebPage类型时,为链接名称,仅在非客户端分享时生效 @param attachementUrl 附件链接(附加的媒体文件(SWF 或 MP3)的网址。如果是 SWF,还必须指定image以提供视频的缩略图) 分享类型为WebPage类型时,为链,仅在非客户端分享时生效 @param type 分享类型 当使用客户端分享时,支持Image、WebPage,Video类型 当不适用客户端分享是,支持Text、Image、WebPage类型 @param dataDictionary 数据存储字典 如果传入nil将新建 */ - (NSMutableDictionary *)SSDKSetupFacebookParamsByText:(NSString *)text image:(id)image url:(NSURL *)url urlTitle:(NSString *)title urlName:(NSString *)urlName attachementUrl:(NSURL *)attachementUrl type:(NSInteger)type dataDictionary:(NSMutableDictionary *)dataDictionary; #pragma mark - ShareUI /** * 显示分享菜单 * * @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图 * @param items 菜单项,如果传入nil,则显示已集成的平台列表 * @param shareParams 分享内容参数 * @param shareStateChangedHandler 分享状态变更事件 * * @return 分享菜单控制器 SSUIShareActionSheetController */ + (id)showShareActionSheet:(UIView *)view items:(NSArray *)items shareParams:(NSMutableDictionary *)shareParams onShareStateChanged:(void (^) (NSInteger state, NSInteger platformType, NSDictionary *userData, id contentEntity, NSError *error, BOOL end))shareStateChangedHandler; /** * 显示内容编辑视图 * * @param platformType 分享的平台类型 * @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。 * @param shareParams 分享内容参数 * @param shareStateChangedHandler 分享状态变更事件 * * @return 内容编辑视图控制器 SSUIShareContentEditorViewController */ + (id)showShareEditor:(NSInteger)platformType otherPlatformTypes:(NSArray *)otherPlatformTypes shareParams:(NSMutableDictionary *)shareParams onShareStateChanged:(void (^) (NSInteger state, NSInteger platformType, NSDictionary *userData, id contentEntity, NSError *error, BOOL end))shareStateChangedHandler; /** * 根据配置文件显示分享菜单 * * @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图 * @param items 菜单项,如果传入nil,则显示已集成的平台列表 * @param contentName ShareContent.xml内标签name属性的值 * @param customFields 自定义字段 * @param shareStateChangedHandler 分享状态变更事件 * * @return 分享菜单控制器 SSUIShareActionSheetController */ + (id)showShareActionSheet:(UIView *)view items:(NSArray *)items contentName:(NSString *)contentName customFields:(NSDictionary *)customFields onShareStateChanged:(void (^) (NSInteger state, NSInteger platformType, NSDictionary *userData, id contentEntity, NSError *error, BOOL end))shareStateChangedHandler; /** * 根据配置文件显示内容编辑视图 * * @param platformType 分享的平台类型 * @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。 * @param contentName ShareContent.xml内标签name属性的值 * @param customFields 自定义字段 * @param shareStateChangedHandler 分享状态变更事件 * * @return 内容编辑视图控制器 SSUIShareContentEditorViewController */ + (id)showShareEditor:(NSInteger)platformType otherPlatformTypes:(NSArray *)otherPlatformTypes contentName:(NSString *)contentName customFields:(NSDictionary *)customFields onShareStateChanged:(void (^) (NSInteger state, NSInteger platformType, NSDictionary *userData, id contentEntity, NSError *error, BOOL end))shareStateChangedHandler; /** * 设置支持的页面方向 */ + (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/IMOBFSocialUser.h ================================================ // // IMOBFSocialUser.h // MOBFoundation // // Created by 冯鸿杰 on 17/2/28. // Copyright © 2017年 MOB. All rights reserved. // #import /** 社交用户信息协议 */ @protocol IMOBFSocialUser /** * 平台类型 */ @property (nonatomic) NSInteger platformType; /** * 用户标识 */ @property (nonatomic, copy) NSString *uid; /** * 昵称 */ @property (nonatomic, copy) NSString *nickname; /** * 头像 */ @property (nonatomic, copy) NSString *icon; /** * 性别 */ @property (nonatomic) NSInteger gender; /** * 用户主页 */ @property (nonatomic, copy) NSString *url; /** * 用户简介 */ @property (nonatomic, copy) NSString *aboutMe; /** * 认证用户类型 */ @property (nonatomic) NSInteger verifyType; /** * 认证描述 */ @property (nonatomic, copy) NSString *verifyReason; /** * 生日 */ @property (nonatomic, strong) NSDate *birthday; /** * 粉丝数 */ @property (nonatomic) NSInteger followerCount; /** * 好友数 */ @property (nonatomic) NSInteger friendCount; /** * 分享数 */ @property (nonatomic) NSInteger shareCount; /** * 注册时间 */ @property (nonatomic) NSTimeInterval regAt; /** * 用户等级 */ @property (nonatomic) NSInteger level; /** * 教育信息 */ @property (nonatomic, strong) NSArray *educations; /** * 职业信息 */ @property (nonatomic, strong) NSArray *works; /** * 原始数据 */ @property (nonatomic, strong) NSDictionary *rawData; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/ISSDKAuthView.h ================================================ // // ISSDKAuthView.h // ShareSDK // // Created by fenghj on 15/12/2. // Copyright © 2015年 掌淘科技. All rights reserved. // #import #import "SSDKTypeDefine.h" @protocol ISSDKAuthView /** * 取消授权 */ - (void)cancel; /** * 授权状态变更时触发 * * @param stateChangedHandler 授权状态变更处理器 */ - (void)onAuthStateChanged:(SSDKAuthorizeStateChangedHandler)stateChangedHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/NSMutableDictionary+SSDKInit.h ================================================ // // NSMutableDictionary+ShareSDK.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "SSDKTypeDefine.h" /** * 初始化分享平台相关 */ @interface NSMutableDictionary (SSDKInit) /** * 设置平台的授权配置 * * @param authSettings 授权配置信息 * 例如在配置新浪微博的初始化信息中设置授权配置信息: * [appInfo SSDKSetAuthSettings:@[@"follow_app_official_microblog"]]; */ - (void)SSDKSetAuthSettings:(NSArray *)authSettings; /** * 设置新浪微博应用信息 * * @param appKey 应用标识 * @param appSecret 应用密钥 * @param redirectUri 回调地址 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupSinaWeiboByAppKey:(NSString *)appKey appSecret:(NSString *)appSecret redirectUri:(NSString *)redirectUri authType:(NSString *)authType; /** * 设置微信(微信好友,微信朋友圈、微信收藏)应用信息 * * @param appId 应用标识 * @param appSecret 应用密钥 */ - (void)SSDKSetupWeChatByAppId:(NSString *)appId appSecret:(NSString *)appSecret; /** * 设置微信(微信好友,微信朋友圈、微信收藏)应用信息 * * @param appId 应用标识 * @param appSecret 应用密钥 * @param backUnionID 是否默认返回unionID 否返回 openID 是则返回 unionID */ - (void)SSDKSetupWeChatByAppId:(NSString *)appId appSecret:(NSString *)appSecret backUnionID:(BOOL)backUnionID; /** * 设置Twitter应用信息 * * @param consumerKey 应用标识 * @param consumerSecret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupTwitterByConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret redirectUri:(NSString *)redirectUri; /** * 设置QQ分享平台(QQ空间,QQ好友分享)应用信息 * * @param appId 应用标识 * @param appKey 应用Key * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupQQByAppId:(NSString *)appId appKey:(NSString *)appKey authType:(NSString *)authType; /** * 设置QQ分享平台(QQ空间,QQ好友分享)应用信息 4.0.0增加 * * @param appId 应用标识 * @param appKey 应用Key * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 * @param useTIM 是否优先使用TIM进行授权及分享 */ - (void)SSDKSetupQQByAppId:(NSString *)appId appKey:(NSString *)appKey authType:(NSString *)authType useTIM:(BOOL)useTIM; /** * 设置QQ分享平台(QQ空间,QQ好友分享)应用信息 4.0.0增加 * * @param appId 应用标识 * @param appKey 应用Key * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 * @param useTIM 是否优先使用TIM进行授权及分享 * @param backUnionID 是否默认返回unionID 否返回 openID 是则返回 unionID */ - (void)SSDKSetupQQByAppId:(NSString *)appId appKey:(NSString *)appKey authType:(NSString *)authType useTIM:(BOOL)useTIM backUnionID:(BOOL)backUnionID; /** * 设置Facebook应用信息 不需要使用facebook客户端分享 * * @param apiKey 应用标识 * @param appSecret 应用密钥 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupFacebookByApiKey:(NSString *)apiKey appSecret:(NSString *)appSecret authType:(NSString *)authType; /** 设置Facebook应用信息 使用facebook客户端分享使用此方法 displayName必须 @since ver 3.6.0 @param apiKey 应用标识 @param appSecret 应用密钥 @param displayName 分享后显示的app名称 需与facebook后台配置一致 使用facebook客户端分享必须 @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupFacebookByApiKey:(NSString *)apiKey appSecret:(NSString *)appSecret displayName:(NSString *)displayName authType:(NSString *)authType; /** * 设置腾讯微博应用信息 * * @param appKey 应用标识 * @param appSecret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupTencentWeiboByAppKey:(NSString *)appKey appSecret:(NSString *)appSecret redirectUri:(NSString *)redirectUri; /** * 设置豆瓣应用信息 * * @param apiKey 应用标识 * @param secret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupDouBanByApiKey:(NSString *)apiKey secret:(NSString *)secret redirectUri:(NSString *)redirectUri; /** * 设置人人网应用信息 * * @param appId 应用标识 * @param appKey 应用Key * @param secretKey 应用密钥 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupRenRenByAppId:(NSString *)appId appKey:(NSString *)appKey secretKey:(NSString *)secretKey authType:(NSString *)authType; /** * 设置开心网应用信息 * * @param apiKey 应用标识 * @param secretKey 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupKaiXinByApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey redirectUri:(NSString *)redirectUri; /** * 设置Pocket应用信息 * * @param consumerKey 应用标识 * @param redirectUri 回调地址 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupPocketByConsumerKey:(NSString *)consumerKey redirectUri:(NSString *)redirectUri authType:(NSString *)authType; /** * 设置Google+应用信息 * * @param clientId 应用标识 * @param clientSecret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupGooglePlusByClientID:(NSString *)clientId clientSecret:(NSString *)clientSecret redirectUri:(NSString *)redirectUri; /** * 设置Instagram应用信息 * * @param clientId 应用标识 * @param clientSecret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupInstagramByClientID:(NSString *)clientId clientSecret:(NSString *)clientSecret redirectUri:(NSString *)redirectUri; /** * 设置LinkedIn应用信息 * * @param apiKey 应用标识 * @param secretKey 应用密钥 * @param redirectUrl 回调地址 */ - (void)SSDKSetupLinkedInByApiKey:(NSString *)apiKey secretKey:(NSString *)secretKey redirectUrl:(NSString *)redirectUrl; /** * 设置Tumblr应用信息 * * @param consumerKey 应用标识 * @param consumerSecret 应用密钥 * @param callbackUrl 回调地址 */ - (void)SSDKSetupTumblrByConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret callbackUrl:(NSString *)callbackUrl; /** * 设置Flickr应用信息 * * @param apiKey 应用标识 * @param apiSecret 应用密钥 */ - (void)SSDKSetupFlickrByApiKey:(NSString *)apiKey apiSecret:(NSString *)apiSecret; /** * 设置有道云笔记应用信息 * * @param consumerKey 应用标识 * @param consumerSecret 应用密钥 * @param oauthCallback 回调地址 */ - (void)SSDKSetupYouDaoNoteByConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret oauthCallback:(NSString *)oauthCallback; /** * 设置印象笔记应用信息,注:中国版和国际版都是调用此接口进行初始化操作。 * * @param consumerKey 应用标识 * @param consumerSecret 应用密钥 * @param sandbox 是否为沙箱模式, YES 沙箱模式,NO 非沙箱模式 */ - (void)SSDKSetupEvernoteByConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret sandbox:(BOOL)sandbox; /** * 设置支付宝好友应用信息 * * @param appId 应用标识 */ - (void)SSDKSetupAliPaySocialByAppId:(NSString *)appId; /** * 设置Pinterest应用信息 * * @param clientId 应用标识 */ - (void)SSDKSetupPinterestByClientId:(NSString *)clientId; /** * 设置KaKao应用信息 * * @param appKey 应用标识, 当使用客户端授权分享和授权时需要传入该标识 * @param restApiKey RestApi标识 * @param redirectUri 回调地址 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupKaKaoByAppKey:(NSString *)appKey restApiKey:(NSString *)restApiKey redirectUri:(NSString *)redirectUri authType:(NSString *)authType; /** * 设置Dropbox应用信息 * * @param appKey 应用标识 * @param appSecret 应用密钥 * @param oauthCallback 回调地址 */ - (void)SSDKSetupDropboxByAppKey:(NSString *)appKey appSecret:(NSString *)appSecret oauthCallback:(NSString *)oauthCallback; /** * 设置VKontakte应用信息 * * @param applicationId 应用标识 * @param secretKey 应用密钥 */ - (void)SSDKSetupVKontakteByApplicationId:(NSString *)applicationId secretKey:(NSString *)secretKey; - (void)SSDKSetupVKontakteByApplicationId:(NSString *)applicationId secretKey:(NSString *)secretKey authType:(NSString *)authType; /** * 设置明道应用信息 * * @param appKey 应用标识 * @param appSecret 应用密钥 * @param redirectUri 回调地址 */ - (void)SSDKSetupMingDaoByAppKey:(NSString *)appKey appSecret:(NSString *)appSecret redirectUri:(NSString *)redirectUri; /** * 设置易信(易信好友,易信朋友圈、易信收藏)应用信息 * * @param appId 应用标识 * @param appSecret 应用密钥 * @param redirectUri 回调地址 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupYiXinByAppId:(NSString *)appId appSecret:(NSString *)appSecret redirectUri:(NSString *)redirectUri authType:(NSString *)authType; /** * 设置Instapaper * * @param consumerKey 应用标识 * @param consumerSecret 应用密钥 */ - (void)SSDKSetupInstapaperByConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; /** * 设置钉钉应用信息 * * @param appId 应用标识 */ - (void)SSDKSetupDingTalkByAppId:(NSString *)appId; /** 设置美拍应用信息 @param appKey 应用标识 */ - (void)SSDKSetupMeiPaiByAppKey:(NSString *)appKey; /** 设置youtube应用信息 @param clientId 应用标识 @param clientSecret 应用密钥 没有则填 "" @param redirectUri 回调地址 redirectUri 可以使用 http://localhost 或 iOSURLscheme:/ 例如:com.googleusercontent.apps.906418427202-jinnbqal1niq4s8isbg2ofsqc5ddkcgr:/ */ - (void)SSDKSetupYouTubeByClientId:(NSString *)clientId clientSecret:(NSString *)clientSecret redirectUri:(NSString *)redirectUri; /** * 设置Line应用信息 * @param authType 授权方式。值可以是:SSDKAuthTypeSSO、SSDKAuthTypeWeb、SSDKAuthTypeBoth,分别代表SSO、网页授权、SSO+网页授权。 */ - (void)SSDKSetupLineAuthType:(NSString *)authType; //打开短信登录的国家列表选择 - (void)SSDKSetpSMSOpenCountryList:(BOOL)open; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/NSMutableDictionary+SSDKShare.h ================================================ // // NSMutableDictionary+SSDKShare.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/9. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "SSDKTypeDefine.h" #import "SSDKImage.h" #import "SSDKData.h" /** * 分享参数构造相关 */ @interface NSMutableDictionary (SSDKShare) /** * 设置分享标识 * * @param flags 标识数组,元素为NSString。 */ - (void)SSDKSetShareFlags:(NSArray *)flags; /** * 使用客户端分享 */ - (void)SSDKEnableUseClientShare; /** 可设置新浪微博使用高级接口进行分享(即应用内使用 statuses/update 和 statuses/upload_url_text这两个高级接口进行分享) statuses/update 原为普通接口 2017年6月30日后修改为高级接口 应用内普通分享接口改变为 statuses/share statuses/share 规则 http://open.weibo.com/wiki/2/statuses/share 注: v4.0.1 废弃此接口 由于使用接口需要设置安全域 并且 无法分享话题所以都统一使用微博SDK进行分享 如果仍需要使用api接口进行分享请调用 SSDKEnableSinaWeiboAPIShare 接口 */ - (void)SSDKEnableAdvancedInterfaceShare __deprecated_msg("discard form v4.0.1"); /** 新浪微博应用内分享 指定使用api进行分享 v4.0.1 */ - (void)SSDKEnableSinaWeiboAPIShare; /** 使用第三方应用插件进行分享 (暂只支持微信 QQ TIM) iOS11 不可用 微信 支持 本地图片(1-9张) 本地视频(SSDKContentTypeFile) 本地音频(SSDKContentTypeFile) 链接(只有链接有作用标题 说明设置无效) QQ&TIM 支持 本地图片(1-9张) 本地视频(SSDKContentTypeFile) 本地音频(SSDKContentTypeFile) 链接(只有链接有作用标题 说明设置无效) QQiPad版本不支持 */ - (void)SSDKEnableExtensionShare; /** * 设置分享参数 * * @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)SSDKSetupShareParamsByText:(NSString *)text images:(id)images url:(NSURL *)url title:(NSString *)title type:(SSDKContentType)type; /** * 设置新浪微博分享参数 * * @param text 文本 * @param title 标题 * @param image 图片对象,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param url 分享链接 * @param latitude 纬度 * @param longitude 经度 * @param objectID 对象ID,标识系统内内容唯一性,应传入系统中分享内容的唯一标识,没有时可以传入nil * @param type 分享类型,仅支持Text、Image、WebPage 类型 设置 SSDKEnableSinaWeiboAPIShare 使用API进行分享 但text中需要附 安全域 安全域在新浪微博开放平台设置 */ - (void)SSDKSetupSinaWeiboShareParamsByText:(NSString *)text title:(NSString *)title image:(id)image url:(NSURL *)url latitude:(double)latitude longitude:(double)longitude objectID:(NSString *)objectID type:(SSDKContentType)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 latitude 纬度 * @param longitude 经度 * @param type 分享类型, 仅支持Text、Image类型 */ - (void)SSDKSetupTencentWeiboShareParamsByText:(NSString *)text images:(id)images latitude:(double)latitude longitude:(double)longitude type:(SSDKContentType)type; /** * 设置微信分享参数 * * @param text 文本 * @param title 标题 * @param url 分享链接 * @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param musicFileURL 音乐文件链接地址 * @param extInfo 扩展信息 * @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage * @param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage * @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo * @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeWechatSession、SSDKPlatformSubTypeWechatTimeline和SSDKPlatformSubTypeWechatFav其中一个 * * 分享文本时: * 设置type为SSDKContentTypeText, 并填入text参数 * * 分享图片时: * 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数 * * 分享网页时: * 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。 * * 分享应用时: * 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。 * * 分享音乐时: * 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。 * * 分享视频时: * 设置type为SSDKContentTypeVideo,并设置text、title、url参数 */ - (void)SSDKSetupWeChatParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url thumbImage:(id)thumbImage image:(id)image musicFileURL:(NSURL *)musicFileURL extInfo:(NSString *)extInfo fileData:(id)fileData emoticonData:(id)emoticonData type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置微信分享参数 * * @param text 文本 * @param title 标题 * @param url 分享链接 * @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param musicFileURL 音乐文件链接地址 * @param extInfo 扩展信息 * @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage * @param emoticonData 表情数据,可以为NSData、UIImage、NSURL(文件路径)、SSDKData、SSDKImage * @param fileExtension 源文件后缀名 * @param sourceFileData 源文件数据,可以为NSData、NSString、NSURL(文件路径)、SSDKData * @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo * @param platformSubType 平台子类型,只能传入其中一个 * * 分享文本时: * 设置type为SSDKContentTypeText, 并填入text参数 * * 分享图片时: * 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数,如果为gif图片则需要填写title和emoticonData参数 * * 分享网页时: * 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。 * * 分享应用时: * 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。 * * 分享音乐时: * 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。 * * 分享视频时: * 设置type为SSDKContentTypeVideo,并设置text、title、url参数 * * 分享文件时: * 设置type为SSDKContentTypeFile(例如.mp3、.mp4、.pdf、.docx的分享),设置title、sourceFileExtension、sourceFileData,以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作参数 */ - (void)SSDKSetupWeChatParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url thumbImage:(id)thumbImage image:(id)image musicFileURL:(NSURL *)musicFileURL extInfo:(NSString *)extInfo fileData:(id)fileData emoticonData:(id)emoticonData sourceFileExtension:(NSString *)fileExtension sourceFileData:(id)sourceFileData type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; //3.6.3 为微信小程序分享增加 /** 设置微信小程序分享 @param title 标题 @param description 详细说明 @param webpageUrl 网址(6.5.6以下版本微信会自动转化为分享链接 必填) @param path 跳转到页面路径 @param thumbImage 缩略图 (必填) @param userName 小程序的userName (必填) @param platformSubType 分享自平台 微信小程序暂只支持 SSDKPlatformSubTypeWechatSession(微信好友分享) */ - (void)SSDKSetupWeChatParamsByTitle:(NSString *)title description:(NSString *)description webpageUrl:(NSURL *)webpageUrl path:(NSString *)path thumbImage:(id)thumbImage userName:(NSString *)userName forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置Twitter分享参数 * * @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 latitude 地理位置,纬度 * @param longitude 地理位置,经度 * @param type 分享类型,仅支持Text、Image类型 */ - (void)SSDKSetupTwitterParamsByText:(NSString *)text images:(id)images latitude:(double)latitude longitude:(double)longitude type:(SSDKContentType)type; /** Twitter 视频分享 @param text 分享内容 @param video 本地文件地址 @param latitude 地理位置,纬度 @param longitude 地理位置,经度 @param str 自定义标示 用于方便管理上传过程 建议使用 (平台_xxx 如: Twitter_0001) 视频的规格要求 https://dev.twitter.com/rest/media/uploading-media.html Video specifications and recommendations */ - (void)SSDKSetupTwitterParamsByText:(NSString *)text video:(NSURL*)video latitude:(double)latitude longitude:(double)longitude tag:(NSString *)str; /** * 设置QQ分享参数 * * @param text 分享内容 * @param title 分享标题 * @param url 分享链接 * @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param type 分享类型, 仅支持Text(仅QQFriend)、Image(仅QQFriend)、WebPage、Audio、Video类型 * @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个 */ - (void)SSDKSetupQQParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url thumbImage:(id)thumbImage image:(id)image type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置QQ分享参数 * * @param text 分享内容 * @param title 分享标题 * @param url 分享链接(如果分享类型为音频/视频时,应该传入音频/视频的网络URL地址) [特别说明:分享视频到QZone时,视频为网络视频,请传入视频网络URL地址;视频为本地视频的,请传入来源于手机系统相册的相关的Asset URL地址] * @param audioFlashURL 分享音频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Audio时生效 * @param videoFlashURL 分享视频时缩略图播放源,仅平台子类型为SSDKPlatformSubTypeQQFriend,且分享类型为Video时生效 * @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage QQ会采用首张图片,QZone则支持图片数组 * @param type 分享类型, 仅支持Text、Image、WebPage、Audio、Video类型 * @param platformSubType 平台子类型,只能传入SSDKPlatformSubTypeQZone或者SSDKPlatformSubTypeQQFriend其中一个 */ - (void)SSDKSetupQQParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url audioFlashURL:(NSURL *)audioFlashURL videoFlashURL:(NSURL *)videoFlashURL thumbImage:(id)thumbImage images:(id)images type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置Facebook分享参数 * * @param text 分享内容 * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param type 分享类型,仅支持Text、Image类型 */ - (void)SSDKSetupFacebookParamsByText:(NSString *)text image:(id)image type:(SSDKContentType)type; /** * 设置Facebook分享参数 * * @param text 分享内容 分享类型为Text类型时,作为文字主体内容 分享类型为WebPage类型时,作为连接描述 * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage 分享类型为Image类型时,若使用客户端分享,可传入 单张/多张 的 本地/网络 图片;如果不使用客户端分享,仅支持单张的本地/网络图片 *【Facebook通过客户端分享图片,可不需依赖任何权限;否则需要申请publish_actions权限】* 分享类型为WebPage类型时,无论是否使用客户端,仅支持单张的网络图片 * @param url 链接 分享类型为WebPage类型时,为链接地址 [如果分享的连接是AppStore/GooglePlay/Facebook个人/公共主页,所对应的图片,标题,描述等参数可能不会生效,而实际生效的是FB通过爬虫网络根据连接搜刮而来的信息] 分享类型为Video类型时,需传入视频地址且但必须是相册地址 * @param title 链接标题 分享类型为WebPage类型时,为链接标题 * @param urlName 连接名称 分享类型为WebPage类型时,为链接名称,仅在非客户端分享时生效 * @param attachementUrl 附件链接(附加的媒体文件(SWF 或 MP3)的网址。如果是 SWF,还必须指定image以提供视频的缩略图) 分享类型为WebPage类型时,为链,仅在非客户端分享时生效 * @param type 分享类型 当使用客户端分享时,支持Image、WebPage,Video类型 当不适用客户端分享是,支持Text、Image、WebPage类型 */ - (void)SSDKSetupFacebookParamsByText:(NSString *)text image:(id)image url:(NSURL *)url urlTitle:(NSString *)title urlName:(NSString *)urlName attachementUrl:(NSURL *)attachementUrl type:(SSDKContentType)type; /** * 设置短信分享参数 * * @param text 文本 * @param title 标题 * @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"] * @param attachments 附件列表, 可以为单个附件也可以为一个数组,元素可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源 * @param recipients 接收人信息,如:@[@"400-685-2216"] * @param type 分享类型,仅支持Text、Image video类型 video在 attachments 附件列表中设置 */ - (void)SSDKSetupSMSParamsByText:(NSString *)text title:(NSString *)title images:(id)images attachments:(id)attachments recipients:(NSArray *)recipients type:(SSDKContentType)type; /** * 设置邮件分享参数 * * @param text 文本 * @param title 标题 * @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"] * @param attachments 附件列表, 可以为单个附件也可以为一个数组,元素可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源 * @param recipients 接收人信息,如:@["tester@163.com"] * @param ccRecipients 抄送人信息,如:@["tester2@163.com"] * @param bccRecipients 密送人信息,如:@["tester3@163.com"] * @param type 分享类型,仅支持Text、Image video类型 video在 attachments 附件列表中设置 */ - (void)SSDKSetupMailParamsByText:(NSString *)text title:(NSString *)title images:(id)images attachments:(id)attachments recipients:(NSArray *)recipients ccRecipients:(NSArray *)ccRecipients bccRecipients:(NSArray *)bccRecipients type:(SSDKContentType)type; /** * 设置拷贝参数 * * @param text 文本,仅在type为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 链接,仅在type为WebPage时有效 * @param type 分享类型,仅支持Text、Image、WebPage类型 */ - (void)SSDKSetupCopyParamsByText:(NSString *)text images:(id)images url:(NSURL *)url type:(SSDKContentType)type; /** * 设置豆瓣分享参数 * * @param text 文本 * @param image 分享图片,当type为Image时,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。当type为WebPage时,只能为网络图片,可以传入NSString(图片路径)、NSURL(图片路径)。 * @param title 网页标题,仅在type为WebPage时有效。 * @param url 网页链接,仅在type为WebPage时有效。 * @param urlDesc 网页描述,仅在type为WebPage时有效。 * @param type 分享类型,仅支持Text、Image、WebPage类型 */ - (void)SSDKSetupDouBanParamsByText:(NSString *)text image:(id)image title:(NSString *)title url:(NSURL *)url urlDesc:(NSString *)urlDesc type:(SSDKContentType)type; /** * 设置人人网分享参数 * * @param text 文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。 * @param url 网页链接,仅在type为WebPage时有效。 * @param albumId 相册ID,指定分享的图片要放入哪个相册,默认为nil,仅在type为Image时有效。 * @param type 分享类型,仅支持Image、WebPage类型 */ - (void)SSDKSetupRenRenParamsByText:(NSString *)text image:(id)image url:(NSURL *)url albumId:(NSString *)albumId type:(SSDKContentType)type; /** * 设置开心网分享参数 * * @param text 文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。 * @param type 分享类型,仅支持Text、Image类型 */ - (void)SSDKSetupKaiXinParamsByText:(NSString *)text image:(id)image type:(SSDKContentType)type; /** * 设置Pocket分享参数 * * @param url 分享链接 * @param title 标题 * @param tags 标签,可以为NSString或者NSArray。为NSString时,标签名称要以逗号分隔;为NSArray时,元素为NSString。 * @param tweetId 关联的推文ID */ - (void)SSDKSetupPocketParamsByUrl:(NSURL *)url title:(NSString *)title tags:(id)tags tweetId:(NSString *)tweetId; /** * 设置GooglePlus分享参数 * * @param text 文本 * @param url 分享链接,仅在type为WebPage时有效 * @param type 分享类型,仅支持Text、WebPage类型 */ - (void)SSDKSetupGooglePlusParamsByText:(NSString *)text url:(NSURL *)url type:(SSDKContentType)type; /** * 设置Instagram分享参数 * * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。 * @param point 分享菜单的显示位置,仅用于iPad版 */ - (void)SSDKSetupInstagramByImage:(id)image menuDisplayPoint:(CGPoint)point; /** 设置Instagram 视频分享参数 video 视频地址 可以为相册地址 或 本地文件地址 @param video 视频地址 可以为相册地址 或 本地文件地址 使用相册地址时 注:为了效果需要确保其为相册的最新文件 */ - (void)SSDKSetupInstagramByVideo:(NSURL *)video; /** * 设置LinkedIn分享参数 * * @param text 分享文本 * @param image 分享图片,只能够是网络图片,传入类型可以为NSString(图片路径), NSURL(图片路径)。 * @param url 分享链接 * @param title 标题 * @param urlDesc 链接的相关描述 * @param visibility 可见性,可以传入anyone或者connections-only,默认为anyone * @param type 分享类型,仅支持Text和WebPage */ - (void)SSDKSetupLinkedInParamsByText:(NSString *)text image:(id)image url:(NSURL *)url title:(NSString *)title urlDesc:(NSString *)urlDesc visibility:(NSString *)visibility type:(SSDKContentType)type; /** * 设置Tumblr分享参数 * * @param text 分享文本 * @param image 分享图片,分享图片 可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage,仅在type为Image时有效。 * @param url 分享链接 * @param title 标题 * @param blogName 博客名称,如果为nil,则默认分享到默认博客中。 * @param type 分享类型,仅支持Text和Image */ - (void)SSDKSetupTumblrParamsByText:(NSString *)text image:(id)image url:(NSURL *)url title:(NSString *)title blogName:(NSString *)blogName type:(SSDKContentType)type; /** * 设置Flickr分享参数 * * @param text 图片描述 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param title 图片标题 * @param tags 图片标签列表 * @param isPublic 指定是否公开图片,NO 私有 YES 公开。 * @param isFriend 指定好友是否可以查看图片,NO 不允许,YES 允许 * @param isFamily 指定家人是否可以查看图片,NO 不允许,YES 允许 * @param safetyLevel 安全级别。1 安全 2 辅导级 3 限制级。 * @param contentType 1 照片、2 屏幕截图、3 其他。 * @param hidden 1 照片、2 屏幕截图、3 其他。 */ - (void)SSDKSetupFlickrParamsByText:(NSString *)text image:(id)image title:(NSString *)title tags:(NSArray *)tags isPublic:(BOOL)isPublic isFriend:(BOOL)isFriend isFamily:(BOOL)isFamily safetyLevel:(NSInteger)safetyLevel contentType:(NSInteger)contentType hidden:(NSInteger)hidden; /** * 设置WhatsApp分享参数 * * @param text 分享文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData、注:只允许指定本地资源 * @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData、注:只允许指定本地资源 * @param point 分享菜单的显示位置,仅用于iPad版 * @param type 分享类型,仅支持Text、Image、Audio、Video */ - (void)SSDKSetupWhatsAppParamsByText:(NSString *)text image:(id)image audio:(id)audio video:(id)video menuDisplayPoint:(CGPoint)point type:(SSDKContentType)type; /** * 设置有道云笔记分享参数 * * @param text 分享文本 * @param images 分享图片列表,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage, * * @param title 标题 * @param source 来源 * @param author 作者 * @param notebook 笔记本 */ - (void)SSDKSetupYouDaoNoteParamsByText:(NSString *)text images:(id)images title:(NSString *)title source:(NSString *)source author:(NSString *)author notebook:(NSString *)notebook; /** * 设置Line分享参数 * * @param text 分享文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param type 分享类型,仅支持Text、Image */ - (void)SSDKSetupLineParamsByText:(NSString *)text image:(id)image type:(SSDKContentType)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 title 标题 必须 * @param notebook 笔记本GUID * @param tags 标签GUID列表 * @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeYinXiang和SSDKPlatformTypeEvernote */ - (void)SSDKSetupEvernoteParamsByText:(NSString *)text images:(id)images title:(NSString *)title notebook:(NSString *)notebook tags:(NSArray *)tags platformType:(SSDKPlatformType)platformType; /** v4.0.0 * 设置印象笔记分享参数,注:中国版和国际版都是调用此接口进行分享参数设置。 * * @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 video 分享的视频的本地地址 仅支持本地视频 仅支持 mp4格式视频 * @param title 标题 * @param notebook 笔记本GUID * @param tags 标签GUID列表 * @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeYinXiang和SSDKPlatformTypeEvernote */ - (void)SSDKSetupEvernoteParamsByText:(NSString *)text images:(id)images video:(NSURL *)video title:(NSString *)title notebook:(NSString *)notebook tags:(NSArray *)tags platformType:(SSDKPlatformType)platformType; /** * 设置支付宝好友分享参数 * * @param text 分享文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param title 标题 * @param url 分享链接 * @param type 分享类型,仅支持Text、Image、WebPage */ - (void)SSDKSetupAliPaySocialParamsByText:(NSString *)text image:(id)image title:(NSString *)title url:(NSURL *)url type:(SSDKContentType)type __deprecated_msg("use [SSDKSetupAliPaySocialParamsByText:image:title:url:type:platformType:] method instead"); /** * 设置支付宝分享参数 * * @param text 分享文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param title 标题 * @param url 分享链接 * @param type 分享类型,仅支持Text、Image、WebPage * @param platformType 分享平台类型,仅支持输入SSDKPlatformTypeAliPaySocial和SSDKPlatformTypeAliPaySocialTimeline * 分享类型,平台支持情况如下: * SSDKPlatformTypeAliPaySocial(支付宝好友):支持Text、Image、WebPage * SSDKPlatformTypeAliPaySocialTimeline(支付宝朋友圈):支持Image、WebPage * */ - (void)SSDKSetupAliPaySocialParamsByText:(NSString *)text image:(id)image title:(NSString *)title url:(NSURL *)url type:(SSDKContentType)type platformType:(SSDKPlatformType)platformType; /** * 设置Pinterest分享参数 * * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param desc 图片描述 * @param url 链接地址 * @param boardName Board名称 */ - (void)SSDKSetupPinterestParamsByImage:(id)image desc:(NSString *)desc url:(NSURL *)url boardName:(NSString *)boardName; /** * 设置KaKao分享参数 * * @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"] 注:SSDKPlatformSubTypeKakaoTalk 只支持网络图片 * @param title 分享链接标题,用于SSDKPlatformSubTypeKaKaoTalk分享 * @param url 分享链接 * @param permission 查看权限:F 表示好友可以查看,A 表示任何人可以查看,M 表示私有,默认为A * @param enableShare 是否允许分享,当查看权限为好友查看时,该选项有效,可以设置内容是否允许再分享。 * @PARAM imageSize 图片尺寸,,用于SSDKPlatformSubTypeKaKaoTalk分享时指定图片尺寸 * @param appButtonTitle 应用按钮标题,用于SSDKPlatformSubTypeKaKaoTalk分享App类型时设置 * @param androidExecParam 启动安卓版应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。 * @param androidMarkParam 安卓版应用的下载地址,如果没有可以为nil * @param iphoneExecParams 启动iPhone应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。 * @param iphoneMarkParam iPhone应用的下载地址,如果没有可以nil * @param ipadExecParams iPad应用时传入参数,如果没有可以为nil,如:@{@"key" : @"value", @"key2" : @"value2"}。此参数仅用于Kakao Talk平台。 * @param ipadMarkParam iPad应用的下载地址,如果没有可以为nil,此参数仅用于Kakao Talk平台。 * @param type 分享类型,仅支持Text、Image、WebPage、App * @param platformSubType 子平台类型,只能传入SSDKPlatformSubTypeKaKaoTalk或者SSDKPlatformSubTypeKaKaoStory * * 分享类型,平台支持情况如下: * Kakao Talk Kakao Story * * Text 仅支持客户端分享 应用内分享和客户端分享 * Image 仅支持网络图片的客户端分享 仅支持应用内分享 * WebPage 仅支持客户端分享 仅支持应用内分享 * App 仅支持客户端分享 不支持 */ - (void)SSDKSetupKaKaoParamsByText:(NSString *)text images:(id)images title:(NSString *)title url:(NSURL *)url permission:(NSString *)permission enableShare:(BOOL)enableShare imageSize:(CGSize)imageSize appButtonTitle:(NSString *)appButtonTitle androidExecParam:(NSDictionary *)androidExecParam androidMarkParam:(NSString *)androidMarkParam iphoneExecParams:(NSDictionary *)iphoneExecParams iphoneMarkParam:(NSString *)iphoneMarkParam ipadExecParams:(NSDictionary *)ipadExecParams ipadMarkParam:(NSString *)ipadMarkParam type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置Dropbox分享参数 * * @param attachment 分享附件。附可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage,注:只允许指定本地资源 */ - (void)SSDKSetupDropboxParamsByAttachment:(id)attachment; /** * 设置VKontakte分享参数 * * @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 groupId 圈子标识,默认为nil,分享到share圈子 * @param friendsOnly 是否为好友可见,默认为NO,表示所有人可以看到。 * @param latitude 纬度 * @param longitude 经度 * @param type 分享类型,仅支持Text、Image、WebPage */ - (void)SSDKSetupVKontakteParamsByText:(NSString *)text images:(id)images url:(NSURL *)url groupId:(NSString *)groupId friendsOnly:(BOOL)friendsOnly latitude:(double)latitude longitude:(double)longitude type:(SSDKContentType)type; /** * 设置明道分享参数 * * @param text 分享文本 * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。分享WebPage时需要指定为网络图片 * @param url 分享链接,仅在WebPage时有效。 * @param title 标题,仅在WebPage时有效 * @param type 分享类型,仅支持Text、Image、WebPage */ - (void)SSDKSetupMingDaoParamsByText:(NSString *)text image:(id)image url:(NSURL *)url title:(NSString *)title type:(SSDKContentType)type; /** * 设置Instapaper分享参数 * * @param url 分享链接,如果isPrivateFromSource为YES并且content不为空时将忽略此参数 * @param title 分享标题 * @param desc 分享的链接描述 * @param content 内容 * @param isPrivateFromSource 是否为私有源 * @param folderId 文件夹ID * @param resolveFinalUrl 解决最终URL问题标识,默认开启,用于解决跳转页面问题,设置为NO则表示不进行跳转 */ - (void)SSDKSetupInstapaperParamsByUrl:(NSURL *)url title:(NSString *)title desc:(NSString *)desc content:(NSString *)content isPrivateFromSource:(BOOL)isPrivateFromSource folderId:(NSInteger)folderId resolveFinalUrl:(BOOL)resolveFinalUrl; /** * 设置微信分享参数 * * @param text 文本 * @param title 标题 * @param url 分享链接 * @param thumbImage 缩略图,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param image 图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage * @param musicFileURL 音乐文件链接地址 * @param extInfo 扩展信息 * @param fileData 文件数据,可以为NSData、UIImage、NSString、NSURL(文件路径)、SSDKData、SSDKImage * @param comment 评论信息,在应用内分享朋友圈时该字段有效 * @param userId 发送給指定用户的唯一标识,在应用内分享好友时需要指定。注:如果双方为非好友关系发送消息即使提示成功,对方也无法接受。 * @param type 分享类型,支持SSDKContentTypeText、SSDKContentTypeImage、SSDKContentTypeWebPage、SSDKContentTypeApp、SSDKContentTypeAudio和SSDKContentTypeVideo * @param platformSubType 平台子类型,只能传入SSDKPlatformTypeYiXinSession、SSDKPlatformTypeYiXinTimeline和SSDKPlatformTypeYiXinFav其中一个 * * 分享文本时: * 设置type为SSDKContentTypeText, 并填入text参数 * * 分享图片时: * 设置type为SSDKContentTypeImage, 非gif图片时:填入title和image参数 * * 分享网页时: * 设置type为SSDKContentTypeWebPage, 并设置text、title、url以及thumbImage参数,如果尚未设置thumbImage则会从image参数中读取图片并对图片进行缩放操作。 * * 分享应用时: * 设置type为SSDKContentTypeApp,并设置text、title、extInfo(可选)以及fileData(可选)参数。 * * 分享音乐时: * 设置type为SSDKContentTypeAudio,并设置text、title、url以及musicFileURL(可选)参数。 * * 分享视频时: * 设置type为SSDKContentTypeVideo,并设置text、title、url参数 */ - (void)SSDKSetupYiXinParamsByText:(NSString *)text title:(NSString *)title url:(NSURL *)url thumbImage:(id)thumbImage image:(id)image musicFileURL:(NSURL *)musicFileURL extInfo:(NSString *)extInfo fileData:(id)fileData comment:(NSString *)comment toUserId:(NSString *)userId type:(SSDKContentType)type forPlatformSubType:(SSDKPlatformType)platformSubType; /** * 设置Facebook Messenger分享参数 * * @param image 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 * @param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。 * @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。 * @param type 分享类型,仅支持Image、Audio、Video */ - (void)SSDKSetupFacebookMessengerParamsByImage:(id)image gif:(id)gif audio:(id)audio video:(id)video type:(SSDKContentType)type; /** 设置Facebook Messenger分享参数 WebPage类型时 image参数 仅支持单张网络图片 @since ver 3.6.0 @param title WebPage类型 标题 @param url WebPage类型 网址 @param text WebPage类型 链接的引用说明 @param images 分享图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。NSArray 图片数组 WebPage类型仅支持单张 网络图片 @param gif 分享GIF图片,可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。 @param audio 分享音频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。 @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData。 @param type 分享类型,支持Image、Audio、Video WebPage */ - (void)SSDKSetupFacebookMessengerParamsByTitle:(NSString *)title url:(NSURL *)url quoteText:(NSString *)text images:(id)images gif:(id)gif audio:(id)audio video:(id)video type:(SSDKContentType)type; /** * 设置Ding Talk分享参数 * * @param text 文本内容 * @param image 图片 * @param title 标题 * @param url 链接 * @param type 分享类型,仅支持Text、Image、Webpage、Audio */ - (void)SSDKSetupDingTalkParamsByText:(NSString *)text image:(id)image title:(NSString *)title url:(NSURL *)url type:(SSDKContentType)type; /** 设置 美拍分享参数 @param url 相册地址 或 本地图片 视频 路径 @param type 分享类型,仅支持Image、Video Auto的自动类型判断需要 MeiPaiConnector.framework 进行支持 */ - (void)SSDKSetupMeiPaiParamsByUrl:(NSURL *)url type:(SSDKContentType)type; /** 设置 YouTube 分享参数 @param video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData @param title 标题 @param description 描述 @param tags 标签,可以为NSString或者NSArray。为NSString时,标签名称要以逗号分隔 为NSArray时,元素为NSString。 @param privacyStatus 视频的隐私权限 只支持 Video类型 */ - (void)SSDKSetupYouTubeParamsByVideo:(id)video title:(NSString *)title description:(NSString *)description tags:(id)tags privacyStatus:(SSDKPrivacyStatus)privacyStatus; /** 设置 YouTube 分享参数 可完全自定义 发布参数 @param video video 分享视频, 可以为NSData、NSString、NSURL(文件路径)、SSDKData @param parts 多个使用逗号隔开 例如 snippet,status 参考 https://developers.google.com/youtube/v3/docs/videos/insert#part @param jsonString Video resource 的 json数据 参考 https://developers.google.com/youtube/v3/docs/videos */ - (void)SSDKSetupYouTubeParamsByVideo:(id)video parts:(NSString *)parts jsonString:(NSString *)jsonString; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKAuthViewStyle.h ================================================ // // SSDKAuthViewStyle.h // ShareSDK // // Created by fenghj on 15/4/13. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import /** * 授权视图样式 */ @interface SSDKAuthViewStyle : NSObject /** * 设置导航栏背景 * * @param image 背景图片 */ + (void)setNavigationBarBackgroundImage:(UIImage *)image; /** * 设置导航栏颜色 * * @param color 背景颜色 */ + (void)setNavigationBarBackgroundColor:(UIColor *)color; /** * 设置标题 * * @param title 标题 */ + (void)setTitle:(NSString *)title; /** * 设置标题文本颜色 * * @param color 颜色 */ + (void)setTitleColor:(UIColor *)color; /** * 设置取消按钮标签 * * @param label 取消按钮标签 */ + (void)setCancelButtonLabel:(NSString *)label; /** * 设置取消按钮标签文本颜色 * * @param color 颜色 */ + (void)setCancelButtonLabelColor:(UIColor *)color; /** * 设置取消按钮图片 * * @param image 图片 */ + (void)setCancelButtonImage:(UIImage *)image; /** * 设置取消按钮的左边距 * * @param margin 边距 */ + (void)setCancelButtonLeftMargin:(CGFloat)margin; /** * 设置导航栏右边按钮 * * @param button 右边按钮 */ + (void)setRightButton:(UIButton *)button; /** * 设置导航栏右边按钮的右边距 * * @param margin 边距 */ + (void)setRightButtonRightMargin:(CGFloat)margin; /** * 设置支持的页面方向 */ + (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation; /** * 设置状态栏样式 * * @param style 样式 */ + (void)setStatusBarStyle:(UIStatusBarStyle)style; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKContentEntity.h ================================================ // // SSDKContentEntity.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/9. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import #import /** * 内容实体 */ @interface SSDKContentEntity : MOBFDataModel /** * 内容标识 */ @property (nonatomic, copy) NSString *cid; /** * 分享文本 */ @property (nonatomic, copy) NSString *text; /** * 分享图片列表,元素为SSDKImage */ @property (nonatomic, retain) NSArray *images; /** * 分享链接列表,元素为NSURL */ @property (nonatomic, retain) NSArray *urls; /** * 原始数据 */ @property (nonatomic, retain) id rawData; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKCredential.h ================================================ // // SSDKAuthorizeCredential.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import /** * 授权类型 */ typedef NS_ENUM(NSUInteger, SSDKCredentialType) { /** * 未知 */ SSDKCredentialTypeUnknown = 0, /** * OAuth 1.x */ SSDKCredentialTypeOAuth1x = 1, /** * OAuth 2 */ SSDKCredentialTypeOAuth2 = 2, //4.0.2 短信 SSDKCredentialTypeSMS = 3, }; /** * 授权凭证 */ @interface SSDKCredential : NSObject /** * 用户标识 */ @property (nonatomic, copy) NSString *uid; /** * 用户令牌 */ @property (nonatomic, copy) NSString *token; /** * 用户令牌密钥 */ @property (nonatomic, copy) NSString *secret; /** * 过期时间 */ @property (nonatomic, strong) NSDate *expired; /** * 授权类型 */ @property (nonatomic) SSDKCredentialType type; /** * 原始数据 */ @property (nonatomic, strong) NSDictionary *rawData; /** * 标识授权是否可用,YES 可用, NO 已过期 */ @property (nonatomic, readonly) BOOL available; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKData.h ================================================ // // SSDKData.h // ShareSDK // // Created by fenghj on 15/6/5. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import /** * 数据 */ @interface SSDKData : NSObject /** * 初始化数据 * * @param URL 数据的地址 * * @return 数据对象 */ - (id)initWithURL:(NSURL *)URL; /** * 初始化数据 * * @param data 原始数据对象 * * @return 数据对象 */ - (id)initWithData:(NSData *)data; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKHttpServiceModel.h ================================================ // // SSDKHttpServiceModel.h // ShareSDK // // Created by youzu on 17/2/28. // Copyright © 2017年 掌淘科技. All rights reserved. // #import #import #import typedef NS_ENUM (NSUInteger, SSPHttpServiceType) { SSPHttpServiceInit = 0, SSPHttpServiceAppend = 1, SSPHttpServiceFinalize = 2, SSPHttpServiceFinish = 3 }; @interface SSDKHttpServiceModel : NSObject @property (nonatomic, copy) NSString *fileURL; @property (nonatomic) NSInteger totalBytes; @property (nonatomic) NSInteger uploadedBytes; @property (nonatomic, copy) NSString *sessionID; @property (nonatomic, weak) MOBFHttpService *httpService; @property (nonatomic, copy) NSString *tag; @property (nonatomic, copy) NSString *callback; @property (nonatomic, copy) NSString *consumerKey; @property (nonatomic, copy) NSString *consumerSecret; @property (nonatomic, copy) NSString *token; @property (nonatomic, copy) NSString *tokenSecret; @property (nonatomic, copy) NSString *mediaID; //facebook video_id @property (nonatomic) NSTimeInterval expiresTime; @property (nonatomic) NSInteger segmentIndex; @property (nonatomic) NSInteger maxIndex; @property (nonatomic, copy)NSString *youtubeJsonString; @property (nonatomic, copy)NSString *youtubeAuthorization; @property (nonatomic, copy)NSString *youtubeParts; @property (nonatomic, copy)NSString *youtubeLocation; @property (nonatomic, copy)NSString *facebookUploadURL; @property (nonatomic, copy)NSString *facebookUploadSessionID; @property (nonatomic) NSInteger facebookStartOffset; @property (nonatomic) NSInteger facebookEndOffset; @property (nonatomic, copy) NSString *dropboxUploadSessionID; @property (nonatomic) SSDKPlatformType platformType; @property (nonatomic) SSPHttpServiceType serviceType; @property (nonatomic, copy) MOBFHttpUploadProgressEvent uploadProgressEvent; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKImage.h ================================================ // // SSDKImage.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/25. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import /** * JPG图片格式 */ extern NSString *const SSDKImageFormatJpeg; /** * PNG图片格式 */ extern NSString *const SSDKImageFormatPng; /** * 图片质量键,当图片为JPG时有效 */ extern NSString *const SSDKImageSettingQualityKey; /** * 图片 */ @interface SSDKImage : NSObject /** * 初始化图片 * * @param URL 图片路径 * * @return 图片对象 */ - (id)initWithURL:(NSURL *)URL; /** * 初始化图片 * * @param image 原始的图片对象 * @param format 图片格式,由SSDKImageFormatJpeg和SSDKImageFormatPng来指定分享出去的是JPG还是PNG图片,如果传入其他值则默认为JPG * * @return 图片对象 */ - (id)initWithImage:(UIImage *)image format:(NSString *)format settings:(NSDictionary *)settings; /** * 获取原生图片对象 * * @param handler 处理器 */ - (void)getNativeImage:(void(^)(UIImage *image))handler; /** * 获取图片数据 * * @param imagePath 图片路径 * @param thumbImagePath 缩略图路径 * @param handler 返回回调 */ + (void)getImage:(NSString *)imagePath thumbImagePath:(NSString *)thumbImagePath result:(void(^)(NSData *thumbImage, NSData *image))handler; /** * 检测缩略图,由于微信限制缩略图不能大于32k,此方法就是用于检测图片大小使用的方法。 * * @param thumbImageData 缩略图数据 * * @return 调整后缩略图数据 */ + (NSData *)checkThumbImageSize:(NSData *)thumbImageData; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKPlatform.h ================================================ // // SSDKPlatform.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "SSDKTypeDefine.h" /** * 分享平台信息 */ @interface SSDKPlatform : NSObject /** * 平台类型 */ @property (nonatomic) SSDKPlatformType type; /** * 平台名称 */ @property (nonatomic, copy) NSString *name; /** * 平台图标 */ @property (nonatomic, retain) UIImage *icon; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKTypeDefine.h ================================================ // // SSDKTypeDefine.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #ifndef ShareSDK_SSDKTypeDefine_h #define ShareSDK_SSDKTypeDefine_h #import "SSDKContentEntity.h" @protocol ISSDKAuthView; @class SSDKUser; @class SSDKFriendsPaging; @class UIView; @class SSDKAddFriendView; /** * 结合SSO和Web授权方式 */ extern NSString *const SSDKAuthTypeBoth; /** * SSO授权方式 */ extern NSString *const SSDKAuthTypeSSO; /** * 网页授权方式 */ extern NSString *const SSDKAuthTypeWeb; /** * HTTP的GET请求方式 */ extern NSString *const SSDKHttpMethodGet; /** * HTTP的POST请求方式 */ extern NSString *const SSDKHttpMethodPost; /** * HTTP的DELETE请求方式 */ extern NSString *const SSDKHttpMethodDelete; /** * HTTP的PUT请求方式 */ extern NSString *const SSDKHttpMethodPut; /** * HTTP的HEAD请求方式 */ extern NSString *const SSDKHttpMethodHead; /** * 授权设置键名, 其对应键值为NSArray,数组中元素为NSString,如:@{SSDKAuthSettingKeyScopes : @[@"all", @"mail"]} */ extern NSString *const SSDKAuthSettingKeyScopes; /** * 平台类型 */ typedef NS_ENUM(NSUInteger, SSDKPlatformType){ /** * 未知 */ SSDKPlatformTypeUnknown = 0, /** * 新浪微博 */ SSDKPlatformTypeSinaWeibo = 1, /** * 腾讯微博 */ SSDKPlatformTypeTencentWeibo = 2, /** * 豆瓣 */ SSDKPlatformTypeDouBan = 5, /** * QQ空间 */ SSDKPlatformSubTypeQZone = 6, /** * 人人网 */ SSDKPlatformTypeRenren = 7, /** * 开心网 */ SSDKPlatformTypeKaixin = 8, /** * Facebook */ SSDKPlatformTypeFacebook = 10, /** * Twitter */ SSDKPlatformTypeTwitter = 11, /** * 印象笔记 */ SSDKPlatformTypeYinXiang = 12, /** * Google+ */ SSDKPlatformTypeGooglePlus = 14, /** * Instagram */ SSDKPlatformTypeInstagram = 15, /** * LinkedIn */ SSDKPlatformTypeLinkedIn = 16, /** * Tumblr */ SSDKPlatformTypeTumblr = 17, /** * 邮件 */ SSDKPlatformTypeMail = 18, /** * 短信 */ SSDKPlatformTypeSMS = 19, /** * 打印 */ SSDKPlatformTypePrint = 20, /** * 拷贝 */ SSDKPlatformTypeCopy = 21, /** * 微信好友 */ SSDKPlatformSubTypeWechatSession = 22, /** * 微信朋友圈 */ SSDKPlatformSubTypeWechatTimeline = 23, /** * QQ好友 */ SSDKPlatformSubTypeQQFriend = 24, /** * Instapaper */ SSDKPlatformTypeInstapaper = 25, /** * Pocket */ SSDKPlatformTypePocket = 26, /** * 有道云笔记 */ SSDKPlatformTypeYouDaoNote = 27, /** * Pinterest */ SSDKPlatformTypePinterest = 30, /** * Flickr */ SSDKPlatformTypeFlickr = 34, /** * Dropbox */ SSDKPlatformTypeDropbox = 35, /** * VKontakte */ SSDKPlatformTypeVKontakte = 36, /** * 微信收藏 */ SSDKPlatformSubTypeWechatFav = 37, /** * 易信好友 */ SSDKPlatformSubTypeYiXinSession = 38, /** * 易信朋友圈 */ SSDKPlatformSubTypeYiXinTimeline = 39, /** * 易信收藏 */ SSDKPlatformSubTypeYiXinFav = 40, /** * 明道 */ SSDKPlatformTypeMingDao = 41, /** * Line */ SSDKPlatformTypeLine = 42, /** * WhatsApp */ SSDKPlatformTypeWhatsApp = 43, /** * KaKao Talk */ SSDKPlatformSubTypeKakaoTalk = 44, /** * KaKao Story */ SSDKPlatformSubTypeKakaoStory = 45, /** * Facebook Messenger */ SSDKPlatformTypeFacebookMessenger = 46, /** * 支付宝好友 */ SSDKPlatformTypeAliPaySocial = 50, /** * 支付宝朋友圈 */ SSDKPlatformTypeAliPaySocialTimeline= 51, /** * 钉钉 */ SSDKPlatformTypeDingTalk = 52, /** * youtube */ SSDKPlatformTypeYouTube = 53, /** * 美拍 */ SSDKPlatformTypeMeiPai = 54, /** * 易信 */ SSDKPlatformTypeYiXin = 994, /** * KaKao */ SSDKPlatformTypeKakao = 995, /** * 印象笔记国际版 */ SSDKPlatformTypeEvernote = 996, /** * 微信平台, */ SSDKPlatformTypeWechat = 997, /** * QQ平台 */ SSDKPlatformTypeQQ = 998, /** * 任意平台 */ SSDKPlatformTypeAny = 999 }; /** * 印象笔记服务器类型 */ typedef NS_ENUM(NSUInteger, SSDKEvernoteHostType){ /** * 沙箱 */ SSDKEvernoteHostTypeSandbox = 0, /** * 印象笔记 */ SSDKEvernoteHostTypeCN = 1, /** * Evernote International */ SSDKEvernoteHostTypeUS = 2, }; /** * 回复状态 */ typedef NS_ENUM(NSUInteger, SSDKResponseState){ /** * 开始 */ SSDKResponseStateBegin = 0, /** * 成功 */ SSDKResponseStateSuccess = 1, /** * 失败 */ SSDKResponseStateFail = 2, /** * 取消 */ SSDKResponseStateCancel = 3, //视频文件开始上传 SSDKResponseStateBeginUPLoad = 4 }; /** * 内容类型 */ typedef NS_ENUM(NSUInteger, SSDKContentType){ /** * 自动适配类型,视传入的参数来决定 */ SSDKContentTypeAuto = 0, /** * 文本 */ SSDKContentTypeText = 1, /** * 图片 */ SSDKContentTypeImage = 2, /** * 网页 */ SSDKContentTypeWebPage = 3, /** * 应用 */ SSDKContentTypeApp = 4, /** * 音频 */ SSDKContentTypeAudio = 5, /** * 视频 */ SSDKContentTypeVideo = 6, /** * 文件类型(暂时仅微信可用) */ SSDKContentTypeFile = 7, //图片类型 仅FacebookMessage 分享图片并需要明确结果时 注此类型分享后不会显示应用名称与icon //v3.6.2 增加 SSDKContentTypeFBMessageImages = 8, //图片类型 仅FacebookMessage 分享视频并需要明确结果时 注此类型分享后不会显示应用名称与icon //所分享的视频地址必须为相册地址 //v3.6.2 增加 SSDKContentTypeFBMessageVideo = 9, //3.6.3 小程序分享(暂时仅微信可用) SSDKContentTypeMiniProgram = 10 }; /** YouTube 视频的隐私状态 */ typedef NS_ENUM(NSUInteger, SSDKPrivacyStatus){ /** * 私有(只有自己可以观看) */ SSDKPrivacyStatusPublic = 0, /** * 公开(任何人都可以搜索和观看) */ SSDKPrivacyStatusPrivate = 1, /** * 不公开(知道链接的人可以观看) */ SSDKPrivacyStatusUnlisted = 2 }; /** * 配置分享平台回调处理器 * * @param platformType 需要初始化的分享平台类型 * @param appInfo 需要初始化的分享平台应用信息 */ typedef void(^SSDKConfigurationHandler) (SSDKPlatformType platformType, NSMutableDictionary *appInfo); /** * 导入原平台SDK回调处理器 * * @param platformType 需要导入原平台SDK的平台类型 */ typedef void(^SSDKImportHandler) (SSDKPlatformType platformType); /** * 授权视图显示回调处理器 * * @param view 授权视图 */ typedef void(^SSDKAuthorizeViewDisplayHandler) (UIView *view); /** * 添加好友视图显示回调处理器,仅用于Facebook添加好友时触发 * * @param view 添加好友视图 */ typedef void(^SSDKAddFriendViewDisplayHandler) (SSDKAddFriendView *view); /** * 授权状态变化回调处理器 * * @param state 状态 * @param user 授权用户信息,当且仅当state为SSDKResponseStateSuccess时返回 * @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回 */ typedef void(^SSDKAuthorizeStateChangedHandler) (SSDKResponseState state, SSDKUser *user, NSError *error); /** * 获取用户状态变更回调处理器 * * @param state 状态 * @param user 用户信息,当且仅当state为SSDKResponseStateSuccess时返回 * @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回 */ typedef void(^SSDKGetUserStateChangedHandler) (SSDKResponseState state, SSDKUser *user, NSError *error); /** * 分享内容状态变更回调处理器 * * @param state 状态 * @param userData 附加数据, 返回状态以外的一些数据描述,如:邮件分享取消时,标识是否保存草稿等 * @param contentEntity 分享内容实体,当且仅当state为SSDKResponseStateSuccess时返回 * @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回 */ typedef void(^SSDKShareStateChangedHandler) (SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error); /** * 调用API状态变更回调处理器 * * @param state 状态 * @param data 返回数据 * @param error 错误信息 */ typedef void(^SSDKCallApiStateChangedHandler)(SSDKResponseState state, id data, NSError *error); /** * 需要授权回调处理器 * * @param authorizeStateChangedHandler 授权状态回调 */ typedef void(^SSDKNeedAuthorizeHandler)(SSDKAuthorizeStateChangedHandler authorizeStateChangedHandler); /** * HTTP上传数据情况 * * @param totalBytes 总字节数 * @param loadedBytes 上传字节数据 */ typedef void(^SSDKHttpUploadProgressHandler) (int64_t totalBytes, int64_t loadedBytes); #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKUser.h ================================================ // // SSDKUser.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "SSDKTypeDefine.h" #import #import @class SSDKCredential; /** * 性别 */ typedef NS_ENUM(NSUInteger, SSDKGender) { /** * 男 */ SSDKGenderMale = 0, /** * 女 */ SSDKGenderFemale = 1, /** * 未知 */ SSDKGenderUnknown = 2, }; /** * 用户信息 */ @interface SSDKUser : MOBFDataModel /** * 平台类型 */ @property (nonatomic) NSInteger platformType; /** * 授权凭证, 为nil则表示尚未授权 */ @property (nonatomic, retain) SSDKCredential *credential; /** * 用户标识 */ @property (nonatomic, copy) NSString *uid; /** * 昵称 */ @property (nonatomic, copy) NSString *nickname; /** * 头像 */ @property (nonatomic, copy) NSString *icon; /** * 性别 */ @property (nonatomic) NSInteger gender; /** * 用户主页 */ @property (nonatomic, copy) NSString *url; /** * 用户简介 */ @property (nonatomic, copy) NSString *aboutMe; /** * 认证用户类型 */ @property (nonatomic) NSInteger verifyType; /** * 认证描述 */ @property (nonatomic, copy) NSString *verifyReason; /** * 生日 */ @property (nonatomic, strong) NSDate *birthday; /** * 粉丝数 */ @property (nonatomic) NSInteger followerCount; /** * 好友数 */ @property (nonatomic) NSInteger friendCount; /** * 分享数 */ @property (nonatomic) NSInteger shareCount; /** * 注册时间 */ @property (nonatomic) NSTimeInterval regAt; /** * 用户等级 */ @property (nonatomic) NSInteger level; /** * 教育信息 */ @property (nonatomic, retain) NSArray *educations; /** * 职业信息 */ @property (nonatomic, retain) NSArray *works; /** * 原始数据 */ @property (nonatomic, retain) NSDictionary *rawData; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKUserQueryConditional.h ================================================ // // SSDKUserQuery.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import /** * 用户查询条件 */ @interface SSDKUserQueryConditional : NSObject /** * 创建用户标识查询条件 * * @param uid 用户标识 * * @return 查询条件对象 */ + (SSDKUserQueryConditional *)userQueryConditionalByUserId:(NSString *)uid; /** * 创建用户名称查询条件 * * @param userName 用户名称 * * @return 查询条件对象 */ + (SSDKUserQueryConditional *)userQueryConditionalByUserName:(NSString *)userName; /** * 创建用户路径查询条件 * * @param path 用户主页路径 * * @return 查询条件对象 */ + (SSDKUserQueryConditional *)userQueryConditionalByPath:(NSString *)path; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/SSDKVideoUploadCenter.h ================================================ // // SSDKVideoUploadCenter.h // ShareSDK // // Created by youzu on 17/2/28. // Copyright © 2017年 掌淘科技. All rights reserved. // #import #import #import "SSDKTypeDefine.h" #import "SSDKHttpServiceModel.h" @interface SSDKVideoUploadCenter : NSObject + (SSDKVideoUploadCenter *)shareInstance; //平台注册 - (void)registePlatform:(SSDKPlatformType)platform platformName:(NSString *)platformName; /** 用于获取上传Model数据 @param platformType 分享平台 @param url 本地资源地址 @param tag 标签 @param progressEvent 上传进度 @return 上传的数据Model */ - (SSDKHttpServiceModel *)uploadProgressWithPlatformType:(SSDKPlatformType)platformType fileURL:(NSURL *)url tag:(NSString *)tag progressEvent:(MOBFHttpUploadProgressEvent)progressEvent; /** 指定 上传Model数据 进行暂停操作 @param model 上传Model数据 */ - (void)stopWithModel:(SSDKHttpServiceModel *)model; /** 指定 上传Model数据 在暂停后进行继续上传 @param model 上传Model数据 */ - (void)continueWithModel:(SSDKHttpServiceModel *)model; /** 指定 上传Model数据 关闭上传操作 @param model 上传Model数据 */ - (void)closeWithModel:(SSDKHttpServiceModel *)model; @property (nonatomic,strong) NSMutableArray *httpServiceArray; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/ShareSDK+Base.h ================================================ // // ShareSDK+Base.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "ISSDKAuthView.h" /** * ShareSDK基础APIs */ @interface ShareSDK (Base) /** * 获取SDK版本 * * @return 版本号 */ + (NSString *)sdkVer; /** * 获取激活的平台列表 * * @return 平台列表 */ + (NSArray *)activePlatforms; /** * 检测平台是否支持授权 * * @param platformType 平台类型 * * @return YES 支持,NO 不支持 */ + (BOOL)isSupportAuth:(SSDKPlatformType)platformType; /** * 获取当前授权用户 * * @param platformType 平台类型 * * @return 用户信息 */ + (SSDKUser *)currentUser:(SSDKPlatformType)platformType; /** * 设置当前授权用户 * * @param user 用户信息 * @param platformType 平台类型 */ + (void)setCurrentUser:(SSDKUser *)user forPlatformType:(SSDKPlatformType)platformType; /** * 分享平台授权 * * @param platformType 平台类型 * @param settings 授权设置 * @param viewDisplayHandler 授权视图显示回调处理,当授权时需要在应用中显示授权时触发此回调(即SSO授权此回调不触发) * @param stateChangedHandler 授权状态变更回调处理 */ + (void)authorize:(SSDKPlatformType)platformType settings:(NSDictionary *)settings onViewDisplay:(SSDKAuthorizeViewDisplayHandler)viewDisplayHandler onStateChanged:(SSDKAuthorizeStateChangedHandler)stateChangedHandler; /** * 获取授权用户信息 * * @param platformType 平台类型 * @param conditional 查询条件 * @param authorizeHandler 授权处理器 * @param stateChangedHandler 状态变更回调处理 */ + (void)getUserInfo:(SSDKPlatformType)platformType conditional:(SSDKUserQueryConditional *)conditional onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onStateChanged:(SSDKGetUserStateChangedHandler)stateChangedHandler; /** * 分享内容 * * @param platformType 平台类型 * @param parameters 分享参数 * @param authorizeHandler 授权处理器 * @param stateChangedHandler 状态变更回调处理 */ + (void)share:(SSDKPlatformType)platformType parameters:(NSMutableDictionary *)parameters onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onStateChanged:(SSDKShareStateChangedHandler)stateChangedHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/ShareSDK.framework/Headers/ShareSDK.h ================================================ // // ShareSDK.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/5. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import #import "NSMutableDictionary+SSDKInit.h" #import "NSMutableDictionary+SSDKShare.h" #import "SSDKTypeDefine.h" #import "SSDKUserQueryConditional.h" #import "SSDKCredential.h" #import "SSDKAuthViewStyle.h" #import "SSDKUser.h" /** * ShareSDK APIs */ @interface ShareSDK : NSObject #pragma mark - 初始化 /** * 初始化ShareSDK应用 * * @param activePlatforms 使用的分享平台集合,如:@[@(SSDKPlatformTypeSinaWeibo), @(SSDKPlatformTypeTencentWeibo)]; * @param importHandler 导入回调处理,当某个平台的功能需要依赖原平台提供的SDK支持时,需要在此方法中对原平台SDK进行导入操作。具体的导入方式可以参考ShareSDKConnector.framework中所提供的方法。 * @param configurationHandler 配置回调处理,在此方法中根据设置的platformType来填充应用配置信息 */ + (void)registerActivePlatforms:(NSArray *)activePlatforms onImport:(SSDKImportHandler)importHandler onConfiguration:(SSDKConfigurationHandler)configurationHandler; #pragma mark - 授权 /** * 分享平台授权 * * @param platformType 平台类型 * @param settings 授权设置,目前只接受SSDKAuthSettingKeyScopes属性设置,如新浪微博关注官方微博:@{SSDKAuthSettingKeyScopes : @[@"follow_app_official_microblog"]},类似“follow_app_official_microblog”这些字段是各个社交平台提供的。 * @param stateChangedHandler 授权状态变更回调处理 */ + (void)authorize:(SSDKPlatformType)platformType settings:(NSDictionary *)settings onStateChanged:(SSDKAuthorizeStateChangedHandler)stateChangedHandler; /** * 判断分享平台是否授权 * * @param platformTypem 平台类型 * @return YES 表示已授权,NO 表示尚未授权 */ + (BOOL)hasAuthorized:(SSDKPlatformType)platformTypem; /** * 取消分享平台授权 * * @param platformType 平台类型 */ + (void)cancelAuthorize:(SSDKPlatformType)platformType; #pragma mark - 用户 /** * 获取授权用户信息 * * @param platformType 平台类型 * @param stateChangedHandler 状态变更回调处理 */ + (void)getUserInfo:(SSDKPlatformType)platformType onStateChanged:(SSDKGetUserStateChangedHandler)stateChangedHandler; /** * 获取用户信息 * * @param platformType 平台类型 * @param conditional 查询条件,如果为nil则获取当前授权用户信息 * @param stateChangedHandler 状态变更回调处理 */ + (void)getUserInfo:(SSDKPlatformType)platformType conditional:(SSDKUserQueryConditional *)conditional onStateChanged:(SSDKGetUserStateChangedHandler)stateChangedHandler; #pragma mark - 分享 /** * 分享内容 * * @param platformType 平台类型 * @param parameters 分享参数 * @param stateChangedHandler 状态变更回调处理 */ + (void)share:(SSDKPlatformType)platformType parameters:(NSMutableDictionary *)parameters onStateChanged:(SSDKShareStateChangedHandler)stateChangedHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKConfigFile.bundle/Map.plist ================================================ ShareContentMapField urlName url_name videoFlashUrl video_flash_url audioFlashUrl audio_flash_url sourceFileExtension source_extension sourceFileData source_file userId uid comment comment resolveFinalUrl resolve_final_url folderId folder_id isPrivateFromSource private_from_source friendsOnly is_friend groupId group_id appButtonTitle app_button_title imageHeight image_height imageWidth image_width ipadMarkParam ipad_market_param ipadExecParam ipad_exec_param iphoneMarkParam iphone_market_param iphoneExecParam iphone_exec_param androidMarkParam android_market_​param androidExecParam android_exec_param enableShare enable_share permission permission boardName board notebook notebook author author source source videoPath video audioPath audio hidden hidden contentType content_type safetyLevel safety_level isFamily is_family isFriend is_friend isPublic is_public blogName blog_name visibility visibility menuY menu_display_y menuX menu_display_x tweetId tweet_id tags tags albumId album_id urlDesc desc bccRecipients bcc_recipients ccRecipients cc_recipients recipients recipients attachmentPath attachments emoticonData emoticon_data gif emoticon_data fileData file_data extInfo ext_info musicUrl audio_url text text title title url url type type images images objectID object_id latitude lat longitude long thumbImage thumb_image SinaWeibo PlatformID 1 AuthType auth_type RedirectUrl redirect_uri AppSecret app_secret AppKey app_key TencentWeibo PlatformID 2 RedirectUri redirect_uri AppSecret app_secret AppKey app_key Douban PlatformID 5 ApiKey api_key Secret secret RedirectUri redirect_uri QZone PlatformID 6 AuthType auth_type AppId app_id AppKey app_key Renren PlatformID 7 AppId app_id ApiKey app_key SecretKey secret_key AuthType auth_type KaiXin PlatformID 8 AppKey api_key AppSecret secret_key RedirectUri redirect_uri Facebook PlatformID 10 ConsumerKey api_key ConsumerSecret app_secret AuthType auth_type Twitter PlatformID 11 ConsumerKey consumer_key ConsumerSecret consumer_secret CallbackUrl redirect_uri Evernote PlatformID 12 HostType host_type ConsumerSecret consumer_secret ConsumerKey consumer_key EvernoteInternational PlatformID 996 HostType host_type ConsumerSecret consumer_secret ConsumerKey consumer_key GooglePlus PlatformID 14 ClientID client_id ClientSecret client_secret RedirectUri redirect_uri Instagram PlatformID 15 ClientId client_id ClientSecret client_secret RedirectUri redirect_uri LinkedIn PlatformID 16 ApiKey api_key SecretKey secret_key RedirectUrl redirect_url Tumblr PlatformID 17 OAuthConsumerKey consumer_key SecretKey consumer_secret CallbackUrl callback_url Email PlatformID 18 ShortMessage PlatformID 19 Print PlatformID 20 Copy PlatformID 21 Wechat PlatformID 22 AppId app_id AppSecret app_secret WechatMoments PlatformID 23 AppId app_id AppSecret app_secret QQ PlatformID 24 AppKey app_key AppId app_id AuthType auth_type Instapaper PlatformID 25 ConsumerKey consumer_key ConsumerSecret consumer_secret Pocket PlatformID 26 ConsumerKey consumer_key RedirectUri redirect_uri AuthType auth_type YouDao PlatformID 27 ConsumerKey consumer_key ConsumerSecret consumer_secret RedirectUri oauth_callback Pinterest PlatformID 30 ClientId client_id Flickr PlatformID 34 ApiKey api_key ApiSecret api_secret Dropbox PlatformID 35 AppKey app_key AppSecret app_secret RedirectUri oauth_callback VKontakte PlatformID 36 ApplicationId application_id SecretKey secret_key AuthType auth_type WechatFavorite PlatformID 37 AppId app_id AppSecret app_secret Yixin PlatformID 38 AppId app_id AppSecret app_secret RedirectUri redirect_uri AuthType auth_type YixinMoments PlatformID 39 AppId app_id AppSecret app_secret RedirectUri redirect_uri AuthType auth_type YixinFav PlatformID 40 AppId app_id AppSecret app_secret RedirectUri redirect_uri AuthType auth_type Mingdao PlatformID 41 AppKey app_key AppSecret app_secret RedirectUri redirect_uri Line PlatformID 42 WhatsApp PlatformID 43 KakaoTalk PlatformID 44 AppKey app_key RestApiKey rest_api_key RedirectUri redirect_uri AuthType auth_type KakaoStory PlatformID 45 AppKey app_key RestApiKey rest_api_key RedirectUri redirect_uri AuthType auth_type FacebookMessenger PlatformID 46 Alipay PlatformID 50 AppId app_id ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKConfigFile.bundle/ShareContent.xml ================================================ Share {text} Share {title} {url} {imgUrl} ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKConfigFile.bundle/ShareSDK.xml ================================================ ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKConfigFile.framework/Headers/ShareSDK+XML.h ================================================ // // ShareSDK+XML.h // ShareSDK // // Created by chenjd on 16/6/6. // Copyright © 2016年 掌淘科技. All rights reserved. // #import @interface ShareSDK (XML) /** * 使用配置文件的方式分享 * * @param contentName ShareContent.xml内标签name属性的值 * @param platformType 平台类型 * @param customFields 自定义字段 * @param stateChangedHandler 状态变更回调处理 */ + (void)shareWithContentName:(NSString *)contentName platform:(SSDKPlatformType)platformType customFields:(NSDictionary *)customFields onStateChanged:(SSDKShareStateChangedHandler)stateChangedHandler; /** * 获取配置文件分享参数 * * @param contentName 分享内容节点名称 * @param customFields 自定义字段 * * @return 分享参数 */ + (NSMutableDictionary *)getShareParamsWithContentName:(NSString *)contentName customFields:(NSDictionary *)customFields; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/SSDKFriendsPaging.h ================================================ // // SSDKFriendsPaging.h // ShareSDK // // Created by 冯 鸿杰 on 15/2/6. // Copyright (c) 2015年 掌淘科技. All rights reserved. // #import /** * 好友分页信息 */ @interface SSDKFriendsPaging : NSObject /** * 前一个游标位置 */ @property (nonatomic) NSInteger prevCursor; /** * 下一个游标位置 */ @property (nonatomic) NSInteger nextCursor; /** * 总数 */ @property (nonatomic) NSUInteger total; /** * 是否存在下一页标识 */ @property (nonatomic) BOOL hasNext; /** * 好友用户信息列表 */ @property (nonatomic, strong) NSArray *users; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/SSEBaseUser.h ================================================ // // SSEBaseUser.h // ShareSDKExtension // // Created by fenghj on 15/6/24. // Copyright (c) 2015年 mob. All rights reserved. // #import /** * 基础用户信息对象 */ @interface SSEBaseUser : NSObject /** * 关联标识, 能够与应用用户系统中的用户唯一对应的标识 */ @property (nonatomic, copy, readonly) NSString *linkId; /** * 关联的社交用户信息 */ @property (nonatomic, strong, readonly) NSDictionary *socialUsers; /** * 更新用户信息, 当成功登录后会自动触发此方法进行用户信息更新, 一般用于在登录成功后将服务器端用户信息赋值于该对象,子类需要覆盖此方法实现 * * @param data 数据 */ - (void)updateInfo:(id)data; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/SSEShareHelper.h ================================================ // // SSEShareHelper.h // ShareSDKExtension // // Created by fenghj on 15/6/17. // Copyright (c) 2015年 mob. All rights reserved. // #import #import /** * 分享事件处理器 * * @param platformType 分享平台 * @param parameters 分享参数 */ typedef void(^SSEShareHandler) (SSDKPlatformType platformType, NSMutableDictionary *parameters); /** * 屏幕截图将要分享事件处理器 * * @param image 屏幕截图 * @param shareHandler 分享事件处理 */ typedef void(^SSEScreenCaptureWillShareHandler) (SSDKImage *image, SSEShareHandler shareHandler); /** * 摇一摇将要分享事件处理器 * * @param shareHandler 分享事件处理 */ typedef void(^SSEShakeWillShareHandler) (SSEShareHandler shareHandler); /** * 一键分享内容状态变更回调处理器 * * @param platformType 平台类型 * @param state 状态 * @param userData 附加数据 * @param contentEntity 分享内容实体 * @param error 错误信息 * @param end 是否结束分享,YES 表示整个一键分享完成, NO 表示还有其他平台正在分享 */ typedef void(^SSEOneKeyShareStateChangeHandler) (SSDKPlatformType platformType, SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end); /** * 分享助手 */ @interface SSEShareHelper : NSObject /** * 一键分享 * * @param platforms 平台标识列表,如:@[@(SSDKPlatformTypeSinaWeibo), @(SSDKPlatformTypeTencentWeibo)] * @param parameters 分享参数 * @param stateChangedHandler 状态变更事件 */ + (void)oneKeyShare:(NSArray *)platforms parameters:(NSMutableDictionary *)parameters onStateChanged:(SSEOneKeyShareStateChangeHandler)stateChangedHandler; /** * 屏幕截图分享 * * @param willShareHandler 将要分享事件,在此事件中处理要分享的平台、参数 * @param stateChangedHandler 状态变更事件 */ + (void)screenCaptureShare:(SSEScreenCaptureWillShareHandler)willShareHandler onStateChanged:(SSDKShareStateChangedHandler)stateChangedHandler; /** * 开始摇一摇分享 * * @param beginShakeHandler 开始摇动事件 * @param endShakeHandler 结束摇动事件 * @param willShareHandler 将要分享事件,在此事件中处理要分享的平台、参数 * @param stateChangedHandler 状态变更事件 */ + (void)beginShakeShare:(void(^)())beginShakeHandler onEndSake:(void(^)())endShakeHandler onWillShareHandler:(SSEShakeWillShareHandler)willShareHandler onStateChanged:(SSDKShareStateChangedHandler)stateChangedHandler; /** * 结束摇一摇分享 */ + (void)endShakeShare; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/SSEThirdPartyLoginHelper.h ================================================ // // SSEThirdPartyLoginHelper.h // ShareSDKExtension // // Created by fenghj on 15/6/17. // Copyright (c) 2015年 mob. All rights reserved. // #import #import @class SSEBaseUser; /** * 用户关联事件处理器 * * @param linkId 关联ID,能够标识用户在应用中的唯一标识。 * @param user 用户信息 * @param userData 用于将自定义数据传递到用户信息中。 */ typedef void (^SSEUserAssociateHandler) (NSString *linkId, SSDKUser *user, id userData); /** * 用户同步事件处理器 * * @param user 社交用户信息 * @param associateHandler 关联事件处理 */ typedef void (^SSEUserSyncHandler) (SSDKUser *user, SSEUserAssociateHandler associateHandler); /** * 用户登录返回事件处理器 * * @param state 状态 * @param user 用户信息 * @param error 错误信息 */ typedef void (^SSELoginResultHandler) (SSDKResponseState state, SSEBaseUser *user, NSError *error); /** * 第三方登录助手 */ @interface SSEThirdPartyLoginHelper : NSObject /** * 用户登录 * * @param platform 平台类型 * @param userSyncHandler 用户同步处理,如关联授权用户信息操作在此事件中进行 * @param loginResultHandler 登录返回事件处理 */ + (void)loginByPlatform:(SSDKPlatformType)platform onUserSync:(SSEUserSyncHandler)userSyncHandler onLoginResult:(SSELoginResultHandler)loginResultHandler; /** * 注销用户 * * @param user 用户信息 * * @return YES 注销成功, NO 注销失败 */ + (BOOL)logout:(SSEBaseUser *)user; /** * 当前登录用户, 如果为nil则表示尚未有用户进行登陆 * * @return 用户信息 */ + (SSEBaseUser *)currentUser; /** * 切换用户 * * @param user 用户信息 * * @return YES 切换成功,NO 切换失败 */ + (BOOL)changeUser:(SSEBaseUser *)user; /** * 获取当前已登录的用户集合, 集合中元素为SSEBaseUser * * @return 用户集合 */ + (NSDictionary *)users; /** * 设置用户类型,用于扩展SSEBaseUser类型后更新接口中返回的用户对象类型,如:创建名叫ExtUser类继承于SSEBaseUser,那么在此接口中传入ExtUser则其他的接口中返回的用户类型均为ExtUser类型。 * * @param userClass 用户类型, 必须为继承SSEBaseUser类的子类型 */ + (void)setUserClass:(Class)userClass; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/SSETypeDefine.h ================================================ // // SSETypeDefine.h // ShareSDKExtension // // Created by 刘靖煌 on 16/10/17. // Copyright © 2016年 mob. All rights reserved. // #ifndef SSETypeDefine_h #define SSETypeDefine_h #import /** * 添加/关注好友状态变更回调处理器 * * @param state 状态 * @param user 好友信息,当且仅当state为SSDKResponseStateSuccess时返回 * @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回 */ typedef void(^SSDKAddFriendStateChangedHandler) (SSDKResponseState state, SSDKUser *user, NSError *error); /** * 获取好友列表状态变更回调处理器 * * @param state 状态 * @param paging 好友列表分页信息,当且仅当state为SSDKResponseStateSuccess时返回 * @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回 */ typedef void(^SSDKGetFriendsStateChangedHandler) (SSDKResponseState state, SSDKFriendsPaging *paging, NSError *error); #endif /* SSETypeDefine_h */ ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKExtension.framework/Headers/ShareSDK+Extension.h ================================================ // // ShareSDK+Extension.h // ShareSDKExtension // // Created by fenghj on 15/7/28. // Copyright (c) 2015年 mob. All rights reserved. // #import #import "SSETypeDefine.h" /** * ShareSDK扩展类目 */ @interface ShareSDK (Extension) /** * 是否安装客户端(支持平台:微博、微信、QQ、QZone、Facebook) * * @param platformType 平台类型 * * @return YES 已安装,NO 尚未安装 */ + (BOOL)isClientInstalled:(SSDKPlatformType)platformType; /** * 根据API接口返回的原始数据来创建用户对象 * * @param rawData 原始数据 * @param platformType 平台类型 * * @return 用户信息对象 */ + (SSDKUser *)userByRawData:(NSDictionary *)rawData forPlatformType:(SSDKPlatformType)platformType; /** * 添加/关注好友 * * @param platformType 平台类型 * @param user 添加/关注用户信息,注:用户信息中的Id或者name项必须有一项填写(不同平台要求不一样),其他字段可选填 * @param stateChangedHandler 状态变更回调处理 */ + (void)addFriend:(SSDKPlatformType)platformType user:(SSDKUser *)user onStateChanged:(SSDKAddFriendStateChangedHandler)stateChangedHandler; /** * 添加好友 * * @param platformType 平台类型 * @param user 需要加为好友的用户信息 * @param authorizeHandler 授权处理器 * @param viewDisplayHandler 视图显示处理器 * @param stateChangedHandler 状态变更回调处理器 */ + (void)addFriend:(SSDKPlatformType)platformType user:(SSDKUser *)user onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onViewDisplay:(SSDKAddFriendViewDisplayHandler)viewDisplayHandler onStateChanged:(SSDKAddFriendStateChangedHandler)stateChangedHandler; /** * 获取好友列表 * * @param platformType 平台类型 * @param cursor 分页游标 * @param size 分页大小 * @param stateChangedHandler 状态变更回调处理 */ + (void)getFriends:(SSDKPlatformType)platformType cursor:(NSUInteger)cursor size:(NSUInteger)size onStateChanged:(SSDKGetFriendsStateChangedHandler)stateChangedHandler; /** * 获取好友列表 * * @param platformType 平台类型 * @param cursor 分页游标 * @param size 分页大小 * @param authorizeHandler 授权处理器 * @param stateChangedHandler 状态变更回调处理 */ + (void)getFriends:(SSDKPlatformType)platformType cursor:(NSUInteger)cursor size:(NSUInteger)size onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onStateChanged:(SSDKGetFriendsStateChangedHandler)stateChangedHandler; #pragma - mark 原Base层 /** * 调用分享平台API * * @param type 平台类型 * @param url 接口请求地址 * @param method 请求方式:GET/POST/DELETE * @param parameters 请求参数 * @param authorizeHandler 授权处理器 * @param stateChangedHandler 状态变更回调处理 */ + (void)callApi:(SSDKPlatformType)type url:(NSString *)url method:(NSString *)method parameters:(NSMutableDictionary *)parameters onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onStateChanged:(SSDKCallApiStateChangedHandler)stateChangedHandler; /** * 调用分享平台API * * @since v3.1.4 * * @param type 平台类型 * @param url 接口请求地址 * @param method 请求方式:GET/POST/DELETE * @param parameters 请求参数 * @param headers 请求头 * @param authorizeHandler 授权处理器 * @param stateChangedHandler 状态变更回调处理 */ + (void)callApi:(SSDKPlatformType)type url:(NSString *)url method:(NSString *)method parameters:(NSMutableDictionary *)parameters headers:(NSMutableDictionary *)headers onAuthorize:(SSDKNeedAuthorizeHandler)authorizeHandler onStateChanged:(SSDKCallApiStateChangedHandler)stateChangedHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.bundle/Base.lproj/ShareSDKUI_Localizable.strings ================================================ /* ShareSDKUI_Localizable.strings ShareSDKUI Created by 刘 靖煌 on 15/7/14. Copyright (c) 2015年 mob. All rights reserved. */ "ShareType_0" = "Unknown"; "ShareType_1" = "Sina Weibo"; "ShareType_2" = "Tencent Weibo"; "ShareType_5" = "Douban"; "ShareType_6" = "QZone"; "ShareType_7" = "Renren"; "ShareType_8" = "Kaixin"; "ShareType_9" = "Pengyou"; "ShareType_10" = "Facebook"; "ShareType_11" = "Twitter"; "ShareType_12" = "Evernote"; "ShareType_13" = "Foursquare"; "ShareType_14" = "Google+"; "ShareType_15" = "Instagram"; "ShareType_16" = "LinkedIn"; "ShareType_17" = "Tumblr"; "ShareType_18" = "Mail"; "ShareType_19" = "SMS"; "ShareType_20" = "Print"; "ShareType_21" = "Copy"; "ShareType_22" = "Wechat contacts"; "ShareType_23" = "Wechat moments"; "ShareType_24" = "QQ"; "ShareType_25" = "Instapaper"; "ShareType_26" = "Pocket"; "ShareType_27" = "YouDao Notes"; "ShareType_28" = "Soho Kan"; "ShareType_30" = "Pinterest"; "ShareType_34" = "Flickr"; "ShareType_35" = "Dropbox"; "ShareType_36" = "VKontakte"; "ShareType_37" = "Wechat favorites"; "ShareType_38" = "Yixin contacts"; "ShareType_39" = "Yixin moments"; "ShareType_40" = "Yixin favorites"; "ShareType_41" = "Mingdao"; "ShareType_42" = "Line"; "ShareType_43" = "WhatsApp"; "ShareType_44" = "KakaoTalk"; "ShareType_45" = "KakaoStory"; "ShareType_46" = "Messenger"; "ShareType_50" = "Alipay"; "ShareType_51" = "Alipay moments"; "ShareType_52" = "DingTalk"; "ShareType_53" = "YouTube"; "ShareType_54" = "Meipai"; "ShareType_995" = "Kakao"; "ShareType_996" = "Evernote"; "ShareType_997" = "Wechat"; "ShareType_998" = "QQ"; "ShareType_999" = "Any"; "Cancel" = "Cancel"; "ShareTo" = "Share to"; "ShareContent" = "Share Content"; "Alert" = "Alert"; "OK" = "OK"; "InputTheShareContent" = "Please input the share content"; "Share" = "Share"; "AuthorizeFailed" = "Authorize failed"; "NoValidPlatform" = "There is no valid platform to show.The reason may be that the active platform need app client to share but the iOS device do not have that app client."; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.bundle/en.lproj/ShareSDKUI_Localizable.strings ================================================ /* ShareSDKUI_Localizable.strings ShareSDKUI Created by 刘 靖煌 on 15/7/14. Copyright (c) 2015年 mob. All rights reserved. */ "ShareType_0" = "Unknown"; "ShareType_1" = "Sina Weibo"; "ShareType_2" = "Tencent Weibo"; "ShareType_5" = "Douban"; "ShareType_6" = "QZone"; "ShareType_7" = "Renren"; "ShareType_8" = "Kaixin"; "ShareType_9" = "Pengyou"; "ShareType_10" = "Facebook"; "ShareType_11" = "Twitter"; "ShareType_12" = "Yinxiang"; "ShareType_13" = "Foursquare"; "ShareType_14" = "Google+"; "ShareType_15" = "Instagram"; "ShareType_16" = "LinkedIn"; "ShareType_17" = "Tumblr"; "ShareType_18" = "Mail"; "ShareType_19" = "SMS"; "ShareType_20" = "Print"; "ShareType_21" = "Copy"; "ShareType_22" = "Wechat contacts"; "ShareType_23" = "Wechat moments"; "ShareType_24" = "QQ"; "ShareType_25" = "Instapaper"; "ShareType_26" = "Pocket"; "ShareType_27" = "YouDao Notes"; "ShareType_28" = "Soho Kan"; "ShareType_30" = "Pinterest"; "ShareType_34" = "Flickr"; "ShareType_35" = "Dropbox"; "ShareType_36" = "VKontakte"; "ShareType_37" = "Wechat favorites"; "ShareType_38" = "Yixin contacts"; "ShareType_39" = "Yixin moments"; "ShareType_40" = "Yixin favorites"; "ShareType_41" = "Mingdao"; "ShareType_42" = "Line"; "ShareType_43" = "WhatsApp"; "ShareType_44" = "KakaoTalk"; "ShareType_45" = "KakaoStory"; "ShareType_46" = "Messenger"; "ShareType_50" = "Alipay"; "ShareType_51" = "Alipay moments"; "ShareType_52" = "DingTalk"; "ShareType_53" = "YouTube"; "ShareType_54" = "Meipai"; "ShareType_995" = "Kakao"; "ShareType_996" = "Evernote"; "ShareType_997" = "Wechat"; "ShareType_998" = "QQ"; "ShareType_999" = "Any"; "Cancel" = "Cancel"; "ShareTo" = "Share to"; "ShareContent" = "Share Content"; "Alert" = "Alert"; "OK" = "OK"; "InputTheShareContent" = "Please input the share content"; "Share" = "Share"; "AuthorizeFailed" = "Authorize failed"; "NoValidPlatform" = "There is no valid platform to show.The reason may be that the active platform need app client to share but the iOS device do not have that app client."; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.bundle/zh-Hans.lproj/ShareSDKUI_Localizable.strings ================================================ /* ShareSDKUI_Localizable.strings ShareSDKUI Created by 刘 靖煌 on 15/7/14. Copyright (c) 2015年 mob. All rights reserved. */ "ShareType_0" = "未知"; "ShareType_1" = "新浪微博"; "ShareType_2" = "腾讯微博"; "ShareType_5" = "豆瓣"; "ShareType_6" = "QQ空间"; "ShareType_7" = "人人网"; "ShareType_8" = "开心网"; "ShareType_9" = "朋友网"; "ShareType_10" = "Facebook"; "ShareType_11" = "Twitter"; "ShareType_12" = "印象笔记"; "ShareType_13" = "Foursquare"; "ShareType_14" = "Google+"; "ShareType_15" = "Instagram"; "ShareType_16" = "LinkedIn"; "ShareType_17" = "Tumblr"; "ShareType_18" = "邮件"; "ShareType_19" = "短信"; "ShareType_20" = "打印"; "ShareType_21" = "拷贝"; "ShareType_22" = "微信好友"; "ShareType_23" = "微信朋友圈"; "ShareType_24" = "QQ"; "ShareType_25" = "Instapaper"; "ShareType_26" = "Pocket"; "ShareType_27" = "有道云笔记"; "ShareType_28" = "搜狐随身看"; "ShareType_30" = "Pinterest"; "ShareType_34" = "Flickr"; "ShareType_35" = "Dropbox"; "ShareType_36" = "VKontakte"; "ShareType_37" = "微信收藏"; "ShareType_38" = "易信好友"; "ShareType_39" = "易信朋友圈"; "ShareType_40" = "易信收藏"; "ShareType_41" = "明道"; "ShareType_42" = "Line"; "ShareType_43" = "WhatsApp"; "ShareType_44" = "KakaoTalk"; "ShareType_45" = "KakaoStory"; "ShareType_46" = "Messenger"; "ShareType_50" = "支付宝好友"; "ShareType_51" = "支付宝朋友圈"; "ShareType_52" = "钉钉"; "ShareType_53" = "YouTube"; "ShareType_54" = "美拍"; "ShareType_995" = "Kakao"; "ShareType_996" = "Evernote"; "ShareType_997" = "微信"; "ShareType_998" = "QQ"; "ShareType_999" = "任何平台"; "Cancel" = "取消"; "ShareTo" = "分享至"; "ShareContent" = "内容分享"; "Alert" = "提示"; "OK" = "知道了"; "InputTheShareContent" = "请输入分享内容"; "Share" = "分享"; "AuthorizeFailed" = "授权失败"; "NoValidPlatform" = "没有有效的分享平台可以显示。原因可能是:分享平台需要客户端才能分享,而这台iOS设备没有安装这些平台的客户端。"; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIEditorViewStyle.h ================================================ // // SSUIEditorViewStyle.h // ShareSDKUI // // Created by chenjd on 15/7/15. // Copyright (c) 2015年 mob. All rights reserved. // #import #import @interface SSUIEditorViewStyle : NSObject /** * 设置导航栏背景 * * @param image 背景图片 */ + (void)setiPhoneNavigationBarBackgroundImage:(UIImage *)image; /** * 设置iPhone导航栏颜色 * * @param color 背景颜色 */ + (void)setiPhoneNavigationBarBackgroundColor:(UIColor *)color; /** * 设置iPad导航栏颜色 * * @param color 背景颜色 */ + (void)setiPadNavigationBarBackgroundColor:(UIColor *)color; /** * 设置编辑界面背景颜色 * * @param color 背景颜色 */ + (void)setContentViewBackgroundColor:(UIColor *)color; /** * 设置标题 * * @param title 标题 */ + (void)setTitle:(NSString *)title; /** * 设置标题文本颜色 * * @param color 颜色 */ + (void)setTitleColor:(UIColor *)color; /** * 设置取消按钮标签 * * @param label 取消按钮标签 */ + (void)setCancelButtonLabel:(NSString *)label; /** * 设置取消按钮标签文本颜色 * * @param color 颜色 */ + (void)setCancelButtonLabelColor:(UIColor *)color; /** * 设置取消按钮背景 * * @param image 图片 */ + (void)setCancelButtonImage:(UIImage *)image; /** * 设置分享按钮标签 * * @param label 取消按钮标签 */ + (void)setShareButtonLabel:(NSString *)label; /** * 设置分享按钮标签文本颜色 * * @param color 颜色 */ + (void)setShareButtonLabelColor:(UIColor *)color; /** * 设置分享按钮背景 * * @param image 图片 */ + (void)setShareButtonImage:(UIImage *)image; /** * 设置支持的页面方向(单独分享编辑页面) */ + (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation; /** * 设置分享编辑页面状态栏风格 */ + (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIShareActionSheetController.h ================================================ // // SSUIShareActionSheet.h // ShareSDKUI // // Created by 刘 靖煌 on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import #import #import "SSUITypeDef.h" /** * 分享菜单 */ @interface SSUIShareActionSheetController : NSObject /** * 支持点击分享菜单栏平台后直接分享的平台(不显示分享编辑页面),默认支持微信和QQ平台。 */ @property (nonatomic, strong) NSMutableSet *directSharePlatforms; /** 消息编辑UI中显示其他平台Icon (其他平台icon 点击选中后可以多平台分享) NO 显示 YES 不显示 默认为 NO */ @property (nonatomic) BOOL noShowOtherPlatformOnEditorView; /** * 初始化分享菜单 * * @param items 菜单项集合 * * @return 分享菜单控制器对象 */ - (instancetype)initWithItems:(NSArray *)items; /** * 显示分享菜单 * * @param view 要显示菜单的视图 */ - (void)showInView:(UIView *)view; /** * 使分享菜单消失 */ - (void)dismiss; /** * 菜单项点击事件 * * @param itemClickHandler 菜单项点击事件处理器 */ - (void)onItemClick:(SSUIShareActionSheetItemClickHandler)itemClickHandler; /** * 分享菜单取消事件 * * @param cancelHandler 取消事件处理器 */ - (void)onCancel:(SSUIShareActionSheetCancelHandler)cancelHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIShareActionSheetCustomItem.h ================================================ // // SSUIShareActionSheetCustomItem.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import "SSUIShareActionSheetItem.h" /** * 自定义分享菜单项 */ @interface SSUIShareActionSheetCustomItem : SSUIShareActionSheetItem /** * 初始化自定义分享菜单项 * * @param icon 图标 * @param label 标签 * @param clickHandler 点击事件 * * @return 分享菜单项对象 */ - (instancetype)initWithIcon:(UIImage *)icon label:(NSString *)label clickHandler:(void(^)())clickHandler; /** * 触发点击 */ - (void)triggerClick; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIShareActionSheetItem.h ================================================ // // SSUIShareActionSheetItem.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import #import /** * 分享菜单项 */ @interface SSUIShareActionSheetItem : UIControl { UIImage *_icon; NSString *_label; } /** * 图标 */ @property (nonatomic, strong) UIImage *icon; /** * 标签 */ @property (nonatomic, copy) NSString *label; /** * 创建平台分享菜单项 * * @param platformType 平台类型 * * @return 分享菜单项 */ + (instancetype)itemWithPlatformType:(SSDKPlatformType)platformType; /** * 创建自定义分享菜单项 * * @param icon 图标 * @param label 标签 * @param clickHandler 点击事件处理 * * @return 分享菜单项 */ + (instancetype)itemWithIcon:(UIImage *)icon label:(NSString *)label onClick:(void(^)())clickHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIShareActionSheetStyle.h ================================================ // // SSUIShareActionSheetStyle.h // ShareSDKUI // // Created by 刘 靖煌 on 15/7/15. // Copyright (c) 2015年 mob. All rights reserved. // #import #import @interface SSUIShareActionSheetStyle : NSObject /** * ShareSDK UI风格 */ typedef NS_ENUM(NSInteger, ShareActionSheetStyle) { ShareActionSheetStyleSystem = 0, // 系统类型,默认 ShareActionSheetStyleSimple = 1, // 简洁类型 }; /** * 设置ShareSDK UI风格 */ + (void)setShareActionSheetStyle:(ShareActionSheetStyle)style; /** * 设置分享菜单栏颜色 * * @param color 背景颜色 */ + (void)setActionSheetColor:(UIColor *)color; /** * 设置分享菜单栏的背景颜色 * * @param color 背景颜色 */ + (void)setActionSheetBackgroundColor:(UIColor *)color; /** * 设置标题文本颜色 */ + (void)setItemNameColor:(UIColor *)color; /** * 设置标题文本字体 */ + (void)setItemNameFont:(UIFont *)font; /** * 设置取消按钮标签文本颜色 * * @param color 颜色 */ + (void)setCancelButtonLabelColor:(UIColor *)color; /** * 设置取消按钮标签字体 */ + (void)setCancelButtonBackgroundColor:(UIColor *)color; /** * 设置UIPageControl的Indicator的颜色 */ + (void)setPageIndicatorTintColor:(UIColor *)color; /** * 设置UIPageControl当前页的Indicator的颜色 */ + (void)setCurrentPageIndicatorTintColor:(UIColor *)color; /** * 设置支持的页面方向(单独控制分享菜单栏) */ + (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation; /** * 设置分享菜单栏状态栏风格 */ + (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle; /** * 取消按钮是否隐藏,默认不隐藏 */ + (void)isCancelButtomHidden:(BOOL)isCancelButtomHidden; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUIShareContentEditorViewController.h ================================================ // // SSUIShareContentEditorView.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import #import #import #import "SSUITypeDef.h" /** * 内容编辑视图 */ @interface SSUIShareContentEditorViewController : NSObject /** * 初始化内容编辑视图 * * @param content 内容 * @param image 图片 * @param platformTypes 平台列表 * * @return 内容视图 */ - (instancetype)initWithContent:(NSString *)content image:(SSDKImage *)image platformTypes:(NSArray *)platformTypes; /** * 显示编辑视图 */ - (void)show; /** * 关闭编辑视图 */ - (void)dismiss; /** * 提交事件 * * @param submitHandler 提交事件触发器 */ - (void)onSubmit:(SSUIShareContentEditorViewSubmitHandler)submitHandler; /** * 取消事件 * * @param cancelHandler 取消事件触发器 */ - (void)onCancel:(SSUIShareContentEditorViewCancelHandler)cancelHandler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/SSUITypeDef.h ================================================ // // SSUITypeDef.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #ifndef ShareSDKUI_SSUITypeDef_h #define ShareSDKUI_SSUITypeDef_h #import @class SSUIShareActionSheetItem; /** * 分享菜单点击事件 * * @param index 索引 * @param item 菜单项 */ typedef void (^SSUIShareActionSheetItemClickHandler) (NSInteger index, SSUIShareActionSheetItem *item); /** * 分享菜单取消事件 */ typedef void (^SSUIShareActionSheetCancelHandler) (); /** * 分享内容视图提交事件 * * @param platforms 将要分享的平台列表 * @param content 分享内容 * @param image 分享图片 */ typedef void (^SSUIShareContentEditorViewSubmitHandler) (NSArray *platforms, NSString *content, SSDKImage *image); /** * 分享内容视图取消事件 */ typedef void (^SSUIShareContentEditorViewCancelHandler) (); /** * @brief 获取视图宽度 * * @param view 视图对象 * * @return 宽度 */ #define SSUI_WIDTH(view) view.bounds.size.width /** * @brief 获取视图高度 * * @param view 视图对象 * * @return 高度 */ #define SSUI_HEIGHT(view) view.bounds.size.height /** * @brief 获取视图原点横坐标 * * @param view 视图对象 * * @return 原点横坐标 */ #define SSUI_LEFT(view) view.frame.origin.x /** * @brief 获取视图原点纵坐标 * * @param view 视图对象 * * @return 原点纵坐标 */ #define SSUI_TOP(view) view.frame.origin.y /** * @brief 获取视图右下角横坐标 * * @param view 视图对象 * * @return 右下角横坐标 */ #define SSUI_RIGHT(view) (SSUI_LEFT(view) + SSUI_WIDTH(view)) /** * @brief 获取视图右下角纵坐标 * * @param view 视图对象 * * @return 右下角纵坐标 */ #define SSUI_BOTTOM(view) (SSUI_TOP(view) + SSUI_HEIGHT(view)) #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/ShareSDK+SSUI.h ================================================ // // ShareSDK+SSUI.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import #import "SSUIShareActionSheetController.h" #import "SSUIShareContentEditorViewController.h" /** * 分享状态变更 * * @param state 返回状态 * @param platformType 平台类型 * @param userData 用户数据 * @param contentEntity 分享内容实体 * @param error 错误信息 * @param end 是否已经结束本次分享标识 */ typedef void (^SSUIShareStateChangedHandler) (SSDKResponseState state, SSDKPlatformType platformType, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end); @interface ShareSDK (SSUI) /** * 显示分享菜单 * * @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图 * @param items 菜单项,如果传入nil,则显示已集成的平台列表 * @param shareParams 分享内容参数 * @param shareStateChangedHandler 分享状态变更事件 * * @return 分享菜单控制器 */ + (SSUIShareActionSheetController *)showShareActionSheet:(UIView *)view items:(NSArray *)items shareParams:(NSMutableDictionary *)shareParams onShareStateChanged:(SSUIShareStateChangedHandler)shareStateChangedHandler; /** * 显示内容编辑视图 * * @param platformType 分享的平台类型 * @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。 * @param shareParams 分享内容参数 * @param shareStateChangedHandler 分享状态变更事件 * * @return 内容编辑视图控制器 */ + (SSUIShareContentEditorViewController *)showShareEditor:(SSDKPlatformType)platformType otherPlatformTypes:(NSArray *)otherPlatformTypes shareParams:(NSMutableDictionary *)shareParams onShareStateChanged:(SSUIShareStateChangedHandler)shareStateChangedHandler; /** * 根据配置文件显示分享菜单 * * @param view 要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图 * @param items 菜单项,如果传入nil,则显示已集成的平台列表 * @param contentName ShareContent.xml内标签name属性的值 * @param customFields 自定义字段 * @param shareStateChangedHandler 分享状态变更事件 * * @return 分享菜单控制器 */ + (SSUIShareActionSheetController *)showShareActionSheet:(UIView *)view items:(NSArray *)items contentName:(NSString *)contentName customFields:(NSDictionary *)customFields onShareStateChanged:(SSUIShareStateChangedHandler)shareStateChangedHandler; /** * 根据配置文件显示内容编辑视图 * * @param platformType 分享的平台类型 * @param otherPlatformTypes 除分享平台外,还可以分享的平台类型。 * @param contentName ShareContent.xml内标签name属性的值 * @param customFields 自定义字段 * @param shareStateChangedHandler 分享状态变更事件 * * @return 内容编辑视图控制器 */ + (SSUIShareContentEditorViewController *)showShareEditor:(SSDKPlatformType)platformType otherPlatformTypes:(NSArray *)otherPlatformTypes contentName:(NSString *)contentName customFields:(NSDictionary *)customFields onShareStateChanged:(SSUIShareStateChangedHandler)shareStateChangedHandler; /** * 设置支持的页面方向 */ + (void)setSupportedInterfaceOrientation:(UIInterfaceOrientationMask)toInterfaceOrientation; + (void)setWeiboURL:(NSString *)weiboURL; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional/ShareSDKUI.framework/Headers/ShareSDKUI.h ================================================ // // ShareSDKUI.h // ShareSDKUI // // Created by fenghj on 15/6/18. // Copyright (c) 2015年 mob. All rights reserved. // #import #import "ShareSDK+SSUI.h" #import "SSUIShareActionSheetController.h" #import "SSUIShareContentEditorViewController.h" @interface ShareSDKUI : NSObject /** * 创建分享菜单 * * @param items 分享菜单项 * * @return 分享菜单控制器 */ + (SSUIShareActionSheetController *)shareActionSheetWithItems:(NSArray *)items; /** * 创建内容编辑视图 * * @param content 内容 * @param image 图片 * @param platformTypes 分享平台列表 * * @return 内容编辑视图控制器 */ + (SSUIShareContentEditorViewController *)contentEditorViewWithContent:(NSString *)content image:(SSDKImage *)image platformTypes:(NSArray *)platformTypes; + (ShareSDKUI *)shareInstance; @property (nonatomic,strong)NSString *weiboURL; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector/FacebookConnector.framework/Headers/FacebookConnector.h ================================================ // // FacebookConnector.h // ShareSDKConnector // // Created by 冯鸿杰 on 16/9/28. // Copyright © 2016年 mob. All rights reserved. // #import /** * Facebook连接器 */ @interface FacebookConnector : NSObject /** * 链接Facebook Messenger以供ShareSDK可以正常使用Facebook Messenger的相关功能 * * @param fbmApiClass Facebook Messenger SDK中的类型,应先导入FBSDKMessengerShareKit.framework,再将[FBSDKMessengerSharer class]传入到参数中。 */ + (void)connectMessenger:(Class)fbmApiClass; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector/MailConnector.framework/Headers/SSDKMailViewControllerStyle.h ================================================ // // SSDKMailViewControllerStyle.h // ShareSDK // // Created by 刘靖煌 on 15/12/24. // Copyright © 2015年 掌淘科技. All rights reserved. // #import #import @interface SSDKMailViewControllerStyle : NSObject /** * 风格共享实例 * * @return 风格类实例 */ + (instancetype)sharedInstance; /** * 支持的方向 */ @property (nonatomic, assign) UIInterfaceOrientationMask supportedInterfaceOrientation; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector/QQConnector.framework/Headers/QQConnector.h ================================================ // // QQConnector.h // ShareSDKConnector // // Created by 冯鸿杰 on 16/9/28. // Copyright © 2016年 mob. All rights reserved. // #import /** * QQ连接器 */ @interface QQConnector : NSObject /** * 连接QQAPI以供ShareSDK可以正常使用QQ或者QQ空间客户端来授权或者分享内容。 * * @param qqApiInterfaceClass QQSDK中的类型,应先导入TencentOpenAPI.framework,再传入[QQApiInterface class]到此参数。 * @param tencentOAuthClass QQSDK中的类型,应先导入TencentOpenAPI.framework,再传入[TencentOAuth class]到此参数。 */ + (void)connect:(Class)qqApiInterfaceClass tencentOAuthClass:(Class)tencentOAuthClass; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector/SinaWeiboConnector.framework/Headers/SinaWeiboConnector.h ================================================ // // SinaWeiboConnector.h // ShareSDKConnector // // Created by 冯鸿杰 on 16/9/28. // Copyright © 2016年 mob. All rights reserved. // #import /** * 新浪微博连接器 */ @interface SinaWeiboConnector : NSObject /** * 连接微博API以供ShareSDK可以使用微博客户端来分享内容,不调用此方法也不会影响应用内分享、授权等相关功能。 * * @param weiboClass 微博SDK中的类型,应先导入libWeiboSDK.a,再传入[WeiboSDK class]到此参数. */ + (void)connect:(Class)weiboSDKClass; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector/WechatConnector.framework/Headers/WeChatConnector.h ================================================ // // SSPWeChatConnector.h // ShareSDKConnector // // Created by 冯鸿杰 on 16/9/28. // Copyright © 2016年 mob. All rights reserved. // #import /** * 微信连接器 */ @interface WeChatConnector : NSObject /** * 链接微信API已供ShareSDK可以正常使用微信的相关功能(授权、分享) * * @param weChatClass 微信SDK中的类型,应先导入libWXApi.a,再传入[WXApi class]到此参数。注:此参数不能为nil,否则会导致授权、分享无法正常使用 * @param delegate 对于需要获取微信回复或请求时传入该委托对象。该对象必须实现WXApiDelegate协议中的方法。 */ + (void)connect:(Class)wxApiClass; + (void)connect:(Class)wxApiClass delegate:(id)delegate; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterface.h ================================================ /// /// \file QQApiInterface.h /// \brief QQApi接口简化封装 /// /// Created by Tencent on 12-5-15. /// Copyright (c) 2012年 Tencent. All rights reserved. /// #import #import "QQApiInterfaceObject.h" /** \brief 处理来至QQ的请求及响应的回调协议 */ @protocol QQApiInterfaceDelegate /** 处理来至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)delegate; /** 向手Q发起分享请求 \param req 分享内容的请求 \return 请求发送结果码 */ + (QQApiSendResultCode)sendReq:(QQBaseReq *)req; /** 向手Q QZone结合版发起分享请求 \note H5分享只支持单张网络图片的传递 \param req 分享内容的请求 \return 请求发送结果码 */ + (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req; /** 向手Q 群部落发起分享请求 \note H5分享只支持单张网络图片的传递 \param req 分享内容的请求 \return 请求发送结果码 */ + (QQApiSendResultCode)SendReqToQQGroupTribe:(QQBaseReq *)req; /** 向手Q发送应答消息 \param resp 应答消息 \return 应答发送结果码 */ + (QQApiSendResultCode)sendResp:(QQBaseResp *)resp; /** 检测是否已安装QQ \return 如果QQ已安装则返回YES,否则返回NO */ + (BOOL)isQQInstalled; /** 检测是否已安装TIM \return 如果TIM已安装则返回YES,否则返回NO */ + (BOOL)isTIMInstalled; /** 批量检测QQ号码是否在线 */ + (void)getQQUinOnlineStatues:(NSArray *)QQUins delegate:(id)delegate; /** 检测QQ是否支持API调用 \return 如果当前安装QQ版本支持API调用则返回YES,否则返回NO */ + (BOOL)isQQSupportApi; /** 检测TIM是否支持API调用 \return 如果当前安装TIM版本支持API调用则返回YES,否则返回NO */ + (BOOL)isTIMSupportApi; /** 启动QQ \return 成功返回YES,否则返回NO */ + (BOOL)openQQ; /** 启动TIM \return 成功返回YES,否则返回NO */ + (BOOL)openTIM; /** 获取QQ下载地址 如果App通过QQApiInterface#isQQInstalledQQApiInterface#isQQSupportApi检测发现QQ没安装或当前版本QQ不支持API调用,可引导用户通过打开此链接下载最新版QQ。 \return iPhoneQQ下载地址 */ + (NSString *)getQQInstallUrl; /** 获取TIM下载地址 如果App通过QQApiInterface#isTIMInstalledQQApiInterface#isTIMSupportApi检测发现TIM没安装或当前版本TIM不支持API调用,可引导用户通过打开此链接下载最新版TIM。 \return iPhoneTIM下载地址 */ + (NSString *)getTIMInstallUrl; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h ================================================ /// /// \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 typedef enum { EQQAPISENDSUCESS = 0, EQQAPIQQNOTINSTALLED = 1, EQQAPIQQNOTSUPPORTAPI = 2, EQQAPIMESSAGETYPEINVALID = 3, EQQAPIMESSAGECONTENTNULL = 4, EQQAPIMESSAGECONTENTINVALID = 5, EQQAPIAPPNOTREGISTED = 6, EQQAPIAPPSHAREASYNC = 7, EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, EQQAPISENDFAILD = -1, EQQAPISHAREDESTUNKNOWN = -2, //未指定分享到QQ或TIM EQQAPITIMNOTINSTALLED = 11, //TIM未安装 EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持 //qzone分享不支持text类型分享 EQQAPIQZONENOTSUPPORTTEXT = 10000, //qzone分享不支持image类型分享 EQQAPIQZONENOTSUPPORTIMAGE = 10001, //当前QQ版本太低,需要更新至新版本才可以支持 EQQAPIVERSIONNEEDUPDATE = 10002, ETIMAPIVERSIONNEEDUPDATE = 10004, } QQApiSendResultCode; #pragma mark - QQApiObject(分享对象类型) // QQApiObject control flags enum { kQQAPICtrlFlagQZoneShareOnStart = 0x01, kQQAPICtrlFlagQZoneShareForbid = 0x02, kQQAPICtrlFlagQQShare = 0x04, kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏 kQQAPICtrlFlagQQShareDataline = 0x10, //数据线 }; // 分享到QQ或TIM typedef enum ShareDestType { ShareDestTypeQQ, ShareDestTypeTIM, }ShareDestType; // QQApiObject /** \brief 所有在QQ及插件间发送的数据对象的根类。 */ __attribute__((visibility("default"))) @interface QQApiObject : NSObject @property(nonatomic,retain) NSString* title; ///< 标题,最长128个字符 @property(nonatomic,retain) NSString* description; ///<简要描述,最长512个字符 @property (nonatomic, assign) uint64_t cflag; @property (nonatomic, assign) ShareDestType shareDestType; //分享到QQ或TIM,必须指定 @end // QQApiResultObject /** \brief 用于请求回应的数据类型。

可能错误码及描述如下:

errorerrorDescription注释
0nil成功
-1param error参数错误
-2group code is invalid该群不在自己的群列表里面
-3upload photo failed上传图片失败
-4user give up the current operation用户放弃当前操作
-5client internal error客户端内部处理错误
*/ __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 enum QQApiURLTargetType{ QQApiURLTargetTypeNotSpecified = 0x00, QQApiURLTargetTypeAudio = 0x01, QQApiURLTargetTypeVideo = 0x02, QQApiURLTargetTypeNews = 0x03 }QQApiURLTargetType; /** @brief URL对象类型。 包括URL地址,URL地址所指向的目标类型及预览图像。 */ __attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject /** URL地址所指向的目标类型. @note 参见QQApi.h 中的 QQApiURLTargetType 定义. */ @property(nonatomic)QQApiURLTargetType targetContentType; @property(nonatomic,retain)NSURL* url; ///QQApiExtendObject对象 @param data 数据内容 @param previewImageData 用于预览的图片 @param title 标题 @param description 此对象,分享的描述 @return 一个自动释放的QQApiExtendObject实例 */ + (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description; /** helper方法获取一个autorelease的QQApiExtendObject对象 @param data 数据内容 @param previewImageData 用于预览的图片 @param title 标题 @param description 此对象,分享的描述 @param imageDataArray 发送的多张图片队列 @return 一个自动释放的QQApiExtendObject实例 */ + (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray; @end // QQApiImageObject /** @brief 图片对象 用于分享图片内容的对象,是一个指定为图片类型的QQApiExtendObject */ @interface QQApiImageObject : QQApiExtendObject @end // QQApiImageArrayForQZoneObject /** @brief 图片对象 用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说QQApiObject */ @interface QQApiImageArrayForQZoneObject : QQApiObject @property(nonatomic,retain) NSArray* imageDataArray;///图片数组 /** 初始化方法 @param imageDataArray 图片数组 @param title 写说说的内容,可以为空 */ - (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title; /** helper方法获取一个autorelease的QQApiExtendObject对象 @param title 写说说的内容,可以为空 @param imageDataArray 发送的多张图片队列 @return 一个自动释放的QQApiExtendObject实例 */ + (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title; @end // QQApiVideoForQZoneObject /** @brief 视频对象 用于分享视频到空间,走写说说路径QQApiObject assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier */ @interface QQApiVideoForQZoneObject : QQApiObject @property(nonatomic, retain) NSString *assetURL; - (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title; + (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title; @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的QQApiWebImageObject对象 @param previewImageURL 用于预览的图片 @param title 标题 @param description 此对象,分享的描述 */ + (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; @end // QQApiGroupTribeImageObject /** @brief 群部落图片对象 用于分享图片内容的对象,是一个指定为图片类型的 可以指定一些其他的附加数据QQApiExtendObject */ @interface QQApiGroupTribeImageObject : QQApiImageObject { NSString *_bid; NSString *_bname; } // 群部落id @property (nonatomic, retain)NSString* bid; // 群部落名称 @property (nonatomic, retain)NSString* bname; @end //QQApiFileObject /** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能) 用于分享文件内容的对象,是一个指定为文件类型的QQApiExtendObject */ @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的QQApiAudioObject @param url 音频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param data 分享内容的预览图像 @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE */ +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; /** 获取一个autorelease的QQApiAudioObject @param url 音频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param previewURL 分享内容的预览图像URL @note 如果url为空,调用QQApi#sendMessage:时将返回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的QQApiVideoObject @param url 视频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param data 分享内容的预览图像 @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE */ +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; /** 获取一个autorelease的QQApiVideoObject @param url 视频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param previewURL 分享内容的预览图像URL @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE */ +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; @end // QQApiNewsObject /** @brief 新闻URL对象 用于分享目标内容为新闻的URL的对象 */ @interface QQApiNewsObject : QQApiURLObject /** 获取一个autorelease的QQApiNewsObject @param url 视频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param data 分享内容的预览图像 @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE */ +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; /** 获取一个autorelease的QQApiNewsObject @param url 视频内容的目标URL @param title 分享内容的标题 @param description 分享内容的描述 @param previewURL 分享内容的预览图像URL @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE */ +(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; @end // QQApiPayObject /** \brief 支付对象 */ @interface QQApiPayObject : QQApiObject @property(nonatomic,retain)NSString* OrderNo; ///<支付订单号,必填 @property(nonatomic,retain)NSString* AppInfo; ///<支付来源信息,必填 -(id)initWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo; ///<初始化方法 +(id)objectWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo;///<工厂方法,获取一个QQApiPayObject对象. @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 //////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 // QQApiWPAObject /** \brief 发起WPA对象 */ @interface QQApiWPAObject : QQApiObject @property(nonatomic,retain)NSString* uin; ///<想要对话的QQ号 -(id)initWithUin:(NSString*)uin; ///<初始化方法 +(id)objectWithUin:(NSString*)uin;///<工厂方法,获取一个QQApiWPAObject对象. @end // QQApiAddFriendObject /** \brief 添加好友 */ @interface QQApiAddFriendObject : QQApiObject @property (nonatomic,retain)NSString* openID; @property (nonatomic,retain)NSString* subID; @property (nonatomic,retain)NSString* remark; -(id)initWithOpenID:(NSString*)openID; ///<初始化方法 +(id)objecWithOpenID:(NSString*)openID; ///<工厂方法,获取一个QQApiAddFriendObject对象. @end // QQApiGameConsortiumBindingGroupObject /** \brief 游戏公会绑定群 */ @interface QQApiGameConsortiumBindingGroupObject : QQApiObject @property (nonatomic,retain)NSString* signature; @property (nonatomic,retain)NSString* unionid; @property (nonatomic,retain)NSString* zoneID; @property (nonatomic,retain)NSString* appDisplayName; -(id)initWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<初始化方法 +(id)objectWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<工厂方法,获取一个QQApiAddFriendObject对象. @end // QQApiGameConsortiumBindingGroupObject /** \brief 加入群 */ @interface QQApiJoinGroupObject : QQApiObject @property (nonatomic,retain)NSString* groupUin; @property (nonatomic,retain)NSString* groupKey; - (id)initWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<初始化方法 + (id)objectWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<同时提供群号和群KEY 工厂方法,获取一个QQApiAddFriendObject对象. + (id)objectWithGroupKey:(NSString*)groupKey; ///<只需要群的KEY 工厂方法,获取一个QQApiAddFriendObject对象. @end // QQApiGroupChatObject /** \brief 发起群会话对象 */ @interface QQApiGroupChatObject : QQApiObject @property(nonatomic,retain)NSString* groupID; ///<想要对话的群号 -(id)initWithGroup:(NSString*)groupID; ///<初始化方法 +(id)objectWithGroup:(NSString*)groupID;///<工厂方法,获取一个QQApiGroupChatObject对象. @end #pragma mark - QQApi请求消息类型 /** QQApi请求消息类型 */ enum QQApiInterfaceReqType { EGETMESSAGEFROMQQREQTYPE = 0, ///< 手Q -> 第三方应用,请求第三方应用向手Q发送消息 ESENDMESSAGETOQQREQTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用向手Q分享消息 ESHOWMESSAGEFROMQQREQTYPE = 2 ///< 手Q -> 第三方应用,请求第三方应用展现消息中的数据 }; /** QQApi应答消息类型 */ enum 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 /** GetMessageFromQQResp应答帮助类 */ @interface GetMessageFromQQResp : QQBaseResp /** 创建一个GetMessageFromQQResp应答实例 \param message 具体分享消息实例 \return 新创建的GetMessageFromQQResp应答实例 */ + (GetMessageFromQQResp *)respWithContent:(QQApiObject *)message; /** 具体分享消息 */ @property (nonatomic, retain) QQApiObject *message; @end /** SendMessageToQQReq请求帮助类 */ @interface SendMessageToQQReq : QQBaseReq /** 创建一个SendMessageToQQReq请求实例 \param message 具体分享消息实例 \return 新创建的SendMessageToQQReq请求实例 */ + (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message; /** 具体分享消息 */ @property (nonatomic, retain) QQApiObject *message; @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 /** ShowMessageFromQQResp应答帮助类 */ @interface ShowMessageFromQQResp : QQBaseResp /** 创建一个ShowMessageFromQQResp应答实例 \param result 展现消息结果 \param errDesp 具体错误描述信息 \return 新创建的ShowMessageFromQQResp应答实例 */ + (ShowMessageFromQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp; @end #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/TencentApiInterface.h ================================================ // // TencentMessage.h // TencentOpenApi_IOS // // Created by qqconnect on 13-5-29. // Copyright (c) 2013年 Tencent. All rights reserved. // #ifndef QQ_OPEN_SDK_LITE #import #import "TencentMessageObject.h" typedef enum { kIphoneQQ, kIphoneQZONE, kIphoneTIM, kThirdApp, } TecnentPlatformType; typedef enum { kTencentApiSuccess, kTencentApiPlatformUninstall, kTencentApiPlatformNotSupport, kTencentApiParamsError, kTencentApiFail, } TencentApiRetCode; @class TencentApiReq; @class TencentApiResp; /** * \brief TencentApiInterface的回调 * * TencentApiInterface的回调接口 * \note v1.0版本只支持腾讯业务拉起第三方请求内容 */ @protocol TencentApiInterfaceDelegate @optional /** * 请求获得内容 当前版本只支持第三方相应腾讯业务请求 */ - (BOOL)onTencentReq:(TencentApiReq *)req; /** * 响应请求答复 当前版本只支持腾讯业务相应第三方的请求答复 */ - (BOOL)onTencentResp:(TencentApiResp *)resp; @end /** * \brief TencentApiInterface的回调 * * TencentApiInterface的调用接口 * \note v1.0版本只支持第三方答复内容 */ @interface TencentApiInterface : NSObject /** * 发送答复返回腾讯业务 * \param resp 答复内容 * \return 返回码 */ + (TencentApiRetCode)sendRespMessageToTencentApp:(TencentApiResp *)resp; /** * 是否可以处理拉起协议 * \param url * \param delegate 指定的回调 * \return 是否是腾讯API认识的消息类型 */ + (BOOL)canOpenURL:(NSURL *)url delegate:(id)delegate; /** * 处理应用拉起协议 * \param url * \param delegate 指定的回调 * \return 是否是腾讯API认识的消息类型 */ + (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; /** * 用户设备是否安装腾讯APP * \param platform 指定的腾讯业务 * \return YES:安装 NO:未安装 */ + (BOOL)isTencentAppInstall:(TecnentPlatformType)platform; /** * 用户设备是否支持调用SDK * \param platform 指定的腾讯业务 * \return YES:支持 NO:不支持 */ + (BOOL)isTencentAppSupportTencentApi:(TecnentPlatformType)platform; @end #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/TencentMessageObject.h ================================================ // // TencentMessageObject.h // TencentOpenApi_IOS // // Created by qqconnect on 13-5-27. // Copyright (c) 2013年 Tencent. All rights reserved. // #ifndef QQ_OPEN_SDK_LITE #import #import #import "sdkdef.h" #define kTextLimit (1024 * 1024) #define kDataLimit (1024 * 1024 * 10) #define kPreviewDataLimit (1024 * 1024) @class TencentApiReq; @class TencentApiResp; /** * 必填的NSArray型参数 */ typedef NSArray *TCRequiredArray; /** * 必填的NSDictionary型参数 */ typedef NSDictionary *TCRequiredDictionary; /** * 必填的TencentApiReq型参数 */ typedef TencentApiReq *TCRequiredReq; /** * 可选的UIImage类型参数 */ typedef NSData *TCOptionalData; /** * 可选的NSArray型参数 */ typedef NSArray *TCOptionalArray; /** * 可选的TencentApiReq型参数 */ typedef TencentApiReq *TCOptionalReq; /** * TencentReqMessageType 请求类型枚举参数 */ typedef enum { /** TX APP请求内容填充(需要第三方开发者填充完成内容后需要主动调用sendRespMessageToTencentApp)*/ ReqFromTencentAppQueryContent, /** TX APP请求展现内容 (不用调用答复) */ ReqFromTencentAppShowContent, /** 第三方 APP 请求内容 */ ReqFromThirdAppQueryContent, /** 第三方 APP 请求展现内容(类似分享)*/ ReqFromThirdAppShowContent, } TencentReqMessageType; typedef enum { RespFromTencentAppQueryContent, RespFromTencentAppShowContent, RespFromThirdAppQueryContent, RespFromThirdAppShowContent, } TencentRespMessageType; /** * TencentObjVersion 腾讯API消息类型枚举 */ typedef enum { /** 文本类型 */ TencentTextObj, /** 图片类型 */ TencentImageObj, /** 音频类型 */ TencentAudioObj, /** 视频类型 */ TencentVideoObj, /** 图片视频类 */ TencentImageAndVideoObj, } TencentObjVersion; /** * \brief 请求包 * * TencentApiReq用来向其他业务发送请求包 */ @interface TencentApiReq : NSObject /** * 根据序列号生成一个请求包 * \param apiSeq 请求序列号 * \param type 请求类型 * \return tencentApiReq实例 */ + (TencentApiReq *)reqFromSeq:(NSInteger)apiSeq type:(TencentReqMessageType)type; /** 请求类型 */ @property (readonly, assign, nonatomic)TCRequiredInt nMessageType; /** 请求平台 */ @property (readonly, assign, nonatomic)NSInteger nPlatform; /** 请求的SDK版本号 */ @property (readonly, assign, nonatomic)NSInteger nSdkVersion; /** 请求序列号 */ @property (readonly, assign, nonatomic)TCRequiredInt nSeq; /** 第三方的APPID */ @property (nonatomic, retain)TCRequiredStr sAppID; /** 请求内容 TencentBaseMessageObj对象数组 */ @property (nonatomic, retain)TCOptionalArray arrMessage; /** 请求的描述 可以用于告诉对方这个请求的特定场景 */ @property (nonatomic, retain)TCOptionalStr sDescription; @end /** * \brief 答复包 * * TencentApiResp用来向其他业务发送答复包 */ @interface TencentApiResp : NSObject /** * 根据序列号生成一个答复包 * \param req 答复对应的请求包(如果req不是TencentApiReq或者他的子类,会抛出异常) * \return 答复包体 */ + (TencentApiResp *)respFromReq:(TencentApiReq *)req; /** 返回码 */ @property (nonatomic, assign)TCOptionalInt nRetCode; /** 返回消息 */ @property (nonatomic, retain)TCOptionalStr sRetMsg; /** 答复对应的请求包 */ @property (nonatomic, retain)TCOptionalReq objReq; @end /** * \brief 消息体 * * TencentBaseMessageObj 应用之间传递消息体 */ @interface TencentBaseMessageObj : NSObject /** 消息类型 */ @property (nonatomic, assign)NSInteger nVersion; /** 消息描述 */ @property (nonatomic, retain)NSString *sName; /** 消息的扩展信息 主要是可以用来进行一些请求消息体的描述 譬如图片要求的width height 文字的关键字什么的, 也可以不用填写*/ @property (nonatomic, retain)NSDictionary *dictExpandInfo; /** * 消息是否有效 */ - (BOOL)isVaild; @end #pragma mark TencentTextMessage /** * \brief 文本的消息体 * * TencentTextMessageObjV1 应用之间传递的文本消息体 */ @interface TencentTextMessageObjV1 : TencentBaseMessageObj /** * 文本 * \note 文本长度不能超过4096个字 */ @property (nonatomic, retain) NSString *sText; /** * 初始化文本消息 * \param text 文本 * \return 初始化返回的文本消息 */ - (id)initWithText:(NSString *)text; @end #pragma mark TecentImageMessage /** * TencentApiImageSourceType 图片数据类型(请求方对数据类型可能会有限制) */ typedef enum { /** 图片数据是url或二进制数据 */ AllImage, /** 图片数据是url */ UrlImage, /** 图片数据是二进制数据 */ DataImage, }TencentApiImageSourceType; /** * \brief 图片的消息体 * * TencentImageMessageObjV1 应用之间传递的图片消息体 */ @interface TencentImageMessageObjV1 : TencentBaseMessageObj /** * 图片数据 * \note 图片不能大于10M */ @property (nonatomic, retain) NSData *dataImage; /** * 缩略图的数据 * \note 图片不能大于1M */ @property (nonatomic, retain) NSData *dataThumbImage; /** 图片URL */ @property (nonatomic, retain) NSString *sUrl; /** 图片的描述 */ @property (nonatomic, retain) NSString *sDescription; /** 图片的size */ @property (nonatomic, assign) CGSize szImage; /** * 图片来源 * \note TencentApiImageSourceType对应的类型 */ @property (readonly, assign) NSInteger nType; /** * 初始化图片消息 * \param dataImage 图片类型 * \return 初始化返回的图片消息 */ - (id)initWithImageData:(NSData *)dataImage; /** * 初始化图片消息 * \param url 图片url * \return 初始化返回的图片消息 */ - (id)initWithImageUrl:(NSString *)url; /** * 初始化图片消息 * \param type 图片类型 * \return 初始化返回的图片消息 */ - (id)initWithType:(TencentApiImageSourceType)type; @end #pragma mark TencentAudioMessage /** * \brief 音频的消息体 * * TencentAudioMessageObjV1 应用之间传递的音频消息体 */ @interface TencentAudioMessageObjV1 : TencentBaseMessageObj /** 音频URL */ @property (nonatomic, retain) NSString *sUrl; /** * 音频的预览图 * \note图片不能大于1M */ @property (nonatomic, retain) NSData *dataImagePreview; /** 音频的预览图URL */ @property (nonatomic, retain) NSString *sImagePreviewUrl; /** 音频的描述 */ @property (nonatomic, retain) NSString *sDescription; /** * 初始化图片消息 * \param url 音频URL * \return 初始化返回的音频消息 */ - (id)initWithAudioUrl:(NSString *)url; @end #pragma mark TencentVideoMessage /** * TencentApiVideoSourceType 视频数据类型(请求方对数据类型可能会有限制) */ typedef enum { /** 视频来源于本地或网络 */ AllVideo, /** 视频来源于本地 */ LocalVideo, /** 视频来源于网络 */ NetVideo, }TencentApiVideoSourceType; /** * \brief 视频的消息体 * * TencentVideoMessageV1 应用之间传递的视频消息体 */ @interface TencentVideoMessageV1 : TencentBaseMessageObj /** * 视频URL * \note 不能超过1024 */ @property (nonatomic, retain) NSString *sUrl; /** * 视频来源 主要是用来让发起方指定视频的来源 * \note TencentApiVideoSourceType 对应的类型 只读参数 */ @property (readonly, assign, nonatomic) NSInteger nType; /** * 视频的预览图 * \note 图片不能大于1M */ @property (nonatomic, retain) NSData *dataImagePreview; /** 视频的预览图URL */ @property (nonatomic, retain) NSString *sImagePreviewUrl; /** 视频的描述 */ @property (nonatomic, retain) NSString *sDescription; /** * 初始化视频消息 * \param url 视频URL * \param type 视频来源类型 * \return 初始化返回的视频消息 */ - (id)initWithVideoUrl:(NSString *)url type:(TencentApiVideoSourceType)type; /** * 初始化视频消息 * \param type 视频来源类型 * \return 初始化返回的视频消息 */ - (id)initWithType:(TencentApiVideoSourceType)type; @end #pragma mark TencentImageMessageObj /** * \brief 视频图片消息体 * * TencentVideoMessageV1 这是一个扩展的类 是一个图片视频类 * \note 图片视频可以任选一个内容填充 但是注意只能填一个 当有一种类型被填充后 另外一个种类型就无法填充了 */ @interface TencentImageAndVideoMessageObjV1 : TencentBaseMessageObj /** 图片消息 */ @property (nonatomic, retain) TencentImageMessageObjV1 *objImageMessage; /** 视频消息 */ @property (nonatomic, retain) TencentVideoMessageV1 *objVideoMessage; /** * 初始化图片消息 * \param dataImage 图片数据 * \param url 视频url * \return 初始化返回的图片视频消息 */ - (id)initWithMessage:(NSData *)dataImage videoUrl:(NSString *)url; /** * 设置图片 * \param dataImage 图片数据 */ - (void)setDataImage:(NSData *)dataImage; /** * 设置视频 * \param videoUrl 视频URL */ - (void)setVideoUrl:(NSString *)videoUrl; @end #endif ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h ================================================ /// /// \file TencentOAuth.h /// \brief QQ互联开放平台授权登录及相关开放接口实现类 /// /// Created by Tencent on 12-12-21. /// Copyright (c) 2012年 Tencent. All rights reserved. /// #import #import "sdkdef.h" #import "TencentOAuthObject.h" #import "TencentApiInterface.h" @protocol TencentSessionDelegate; @protocol TencentLoginDelegate; @protocol TencentApiInterfaceDelegate; @protocol TencentWebViewDelegate; @class TencentApiReq; @class TencentApiResp; typedef enum { kTencentNotAuthorizeState, kTencentSSOAuthorizeState, kTencentWebviewAuthorzieState, } TencentAuthorizeState; typedef enum { kAuthModeClientSideToken, kAuthModeServerSideCode, } TencentAuthMode; #pragma mark - TencentOAuth(授权登录及相关开放接口调用) /** * \brief TencentOpenAPI授权登录及相关开放接口调用 * * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用 */ @interface TencentOAuth : NSObject { NSMutableDictionary* _apiRequests; NSString* _accessToken; NSDate* _expirationDate; id _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 sessionDelegate; /** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */ @property(nonatomic, copy) NSString* localAppId; /** 用户授权登录后对该用户的唯一标识 */ @property(nonatomic, copy) NSString* openId; /** 用户登录成功过后的跳转页面地址 */ @property(nonatomic, copy) NSString* redirectURI; /** 第三方应用在互联开放平台申请的appID */ @property(nonatomic, retain) NSString* appId; /** 主要是互娱的游戏设置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; /** * 用来获得当前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版本号 **/ + (QQVersion)iphoneQQVersion; /** * 用来获得当前手机TIM的版本号 * \return 返回手机qq版本号 **/ + (QQVersion)iphoneTIMVersion; /** * 初始化TencentOAuth对象 * \param appId 第三方应用在互联开放平台申请的唯一标识 * \param delegate 第三方应用用于接收请求返回结果的委托对象 * \return 初始化后的授权登录对象 */ - (id)initWithAppId:(NSString *)appId andDelegate:(id)delegate; /** * 判断用户手机上是否安装手机QQ * \return YES:安装 NO:没安装 */ + (BOOL)iphoneQQInstalled; /** * 判断用户手机上是否安装手机TIM * \return YES:安装 NO:没安装 */ + (BOOL)iphoneTIMInstalled; /** * 判断用户手机上的手机QQ是否支持SSO登录 * \return YES:支持 NO:不支持 */ + (BOOL)iphoneQQSupportSSOLogin; /** * 判断用户手机上的手机TIM是否支持SSO登录 * \return YES:支持 NO:不支持 */ + (BOOL)iphoneTIMSupportSSOLogin; /** * 判断用户手机上是否安装手机QZone * \return YES:安装 NO:没安装 */ + (BOOL)iphoneQZoneInstalled; /** * 判断用户手机上的手机QZone是否支持SSO登录 * \return YES:支持 NO:不支持 */ + (BOOL)iphoneQZoneSupportSSOLogin; /** * 登录授权 * * \param permissions 授权信息列 */ - (BOOL)authorize:(NSArray *)permissions; /** * 登录授权 * \param permissions 授权信息列表 * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 */ - (BOOL)authorize:(NSArray *)permissions inSafari:(BOOL)bInSafari; /** * 登录授权 * \param permissions 授权信息列表 * \param localAppId 应用APPID * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 */ - (BOOL)authorize:(NSArray *)permissions localAppId:(NSString *)localAppId inSafari:(BOOL)bInSafari; /** * 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权 * \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; /** * (静态方法)获取TencentOAuth调用的上一次错误信息 */ + (NSString *)getLastErrorMsg; /** * 以Server Side Code模式授权登录时,通过此接口获取返回的code值; * 以Client Side Token模式授权登录时,忽略此接口。 */ - (NSString *)getServerSideCode; /** * 退出登录(退出登录后,TecentOAuth失效,需要重新初始化) * \param delegate 第三方应用用于接收请求返回结果的委托对象 */ - (void)logout:(id)delegate; /** * 判断登录态是否有效 * \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权 */ - (BOOL)isSessionValid; /** * 获取用户个人信息 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)getUserInfo; /** * SDK内置webview实现定向分享时,第三方应用可以根据应用是否在白名单里来开启该配置开关,默认为关闭; * 在白名单里的应用调用该接口后,即打开sdk内置webview的二级白名单开关(相对与sdk后台的白名单), * 那么在sdk后台白名单校验请求失败的情况下,会继续先尝试采用内置webview进行分享。 */ - (void)openSDKWebViewQQShareEnable; /** * 获取用户QZone相册列表 * \attention 需\ref apply_perm * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)getListAlbum; /** * 获取用户QZone相片列表 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCListPhotoDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)getListPhotoWithParams:(NSMutableDictionary *)params; /** * 分享到QZone * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddShareDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)addShareWithParams:(NSMutableDictionary *)params; /** * 上传照片到QZone指定相册 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCUploadPicDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)uploadPicWithParams:(NSMutableDictionary *)params; /** * 在QZone相册中创建一个新的相册 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddAlbumDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)addAlbumWithParams:(NSMutableDictionary *)params; /** * 检查是否是QZone某个用户的粉丝 * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCCheckPageFansDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)checkPageFansWithParams:(NSMutableDictionary *)params; /** * 在QZone中发表一篇日志 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddOneBlogDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)addOneBlogWithParams:(NSMutableDictionary *)params; /** * 在QZone中发表一条说说 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddTopicDic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)addTopicWithParams:(NSMutableDictionary *)params; /** * 设置QQ头像 使用默认的效果处理设置头像的界面 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)setUserHeadpic:(NSMutableDictionary *)params; /** * 设置QQ头像 会返回设置头像由第三方自己处理界面的弹出方式 * \attention 需\ref apply_perm * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic * \param viewController 设置头像的界面 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)setUserHeadpic:(NSMutableDictionary *)params andViewController:(UIViewController **)viewController; /** * 获取QQ会员信息(仅包括是否为QQ会员,是否为年费QQ会员) * \attention 需\ref apply_perm * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)getVipInfo; /** * 获取QQ会员详细信息 * \attention 需\ref apply_perm * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)getVipRichInfo; /** * QZone定向分享,可以@到具体好友,完成后将触发responseDidReceived:forMessage:回调,message:“SendStory” * \param params 参数字典 * \param fopenIdArray 第三方应用预传人好友列表,好友以openid标识 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)sendStory:(NSMutableDictionary *)params friendList:(NSArray *)fopenIdArray; /** * 发送应用邀请,完成后将触发responseDidReceived:forMessage:回调,message:“AppInvitation” * \param desc 应用的描述文字,不超过35字符,如果为nil或@“”则显示默认描述 * \param imageUrl 应用的图标,如果为nil或者@“”则显示默认图标 * \param source 透传参数,由开发者自定义该参数内容 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)sendAppInvitationWithDescription:(NSString *)desc imageURL:(NSString *)imageUrl source:(NSString *)source; /** * 发起PK或者发送炫耀,完成后将触发responseDidReceived:forMessage:回调,message:“AppChallenge” * \param receiver 必须指定一位进行PK或者炫耀的好友,填写其OpenID,填写多个OpenID将截取第一个 * \param type 类型,"pk"或者“brag” * \param imageUrl 炫耀/挑战场景图的URL * \param message 炫耀/挑战中的内容描述,不超过50个字符,超过限制则自动截断 * \param source 透传参数,由开发者自定义该参数内容 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)sendChallenge:(NSString *)receiver type:(NSString *)type imageURL:(NSString *)imageUrl message:(NSString *)message source:(NSString *)source; /** * 赠送或者请求礼物,完成后将触发responseDidReceived:forMessage:回调,message:“AppGiftRequest” * \param receiver 赠送或者请求礼物的好友的OpenID,支持填写多个,OpenID之用","分隔,为nil时将由用户通过好友选择器选择好友 * \param exclude 用户通过好友选择器选择好友场景下,希望排除的好友(不显示在好友选择器) * \param specified 用户通过好友选择器选择好友场景下,希望出现的指定好友 * \param only 是否只显示specified指定的好友 * \param type 类型,"request"或者“freegift” * \param title 免费礼物或请求名称,不超过6个字符 * \param message 礼物或请求的默认赠言,控制在35个汉字以内,超过限制自动截断 * \param imageUrl 请求或礼物配图的URL,如果不传,则默认在弹框中显示应用的icon * \param source 透传参数,由开发者自定义该参数内容 * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 */ - (BOOL)sendGiftRequest:(NSString *)receiver exclude:(NSString *)exclude specified:(NSString *)specified only:(BOOL)only type:(NSString *)type title:(NSString *)title message:(NSString *)message imageURL:(NSString *)imageUrl source:(NSString *)source; /** * 退出指定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)callback; /** * TencentOpenApi发送任务统一接口 * \param request 请求发送的任务 * \param callback 任务发送后的回调地址 */ - (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id)callback; - (NSString *)getUserOpenID; @end #pragma mark - TencentLoginDelegate(授权登录回调协议) /** * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议 * * 第三方应用实现登录的回调协议 */ @protocol TencentLoginDelegate @required /** * 登录成功后的回调 */ - (void)tencentDidLogin; /** * 登录失败后的回调 * \param cancelled 代表用户是否主动退出登录 */ - (void)tencentDidNotLogin:(BOOL)cancelled; /** * 登录时网络有问题的回调 */ - (void)tencentDidNotNetWork; @optional /** * 登录时权限信息的获得 */ - (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams; /** * unionID获得 */ - (void)didGetUnionID; @end #pragma mark - TencentSessionDelegate(开放接口回调协议) /** * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议 * * 第三方应用需要实现每条需要调用的API的回调协议 */ @protocol TencentSessionDelegate @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; /** * 获取用户QZone相册列表回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/getListAlbumResponse.exp success * 错误返回示例: \snippet example/getListAlbumResponse.exp fail */ - (void)getListAlbumResponse:(APIResponse*) response; /** * 获取用户QZone相片列表 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/getListPhotoResponse.exp success * 错误返回示例: \snippet example/getListPhotoResponse.exp fail */ - (void)getListPhotoResponse:(APIResponse*) response; /** * 检查是否是QZone某个用户的粉丝回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/checkPageFansResponse.exp success * 错误返回示例: \snippet example/checkPageFansResponse.exp fail */ - (void)checkPageFansResponse:(APIResponse*) response; /** * 分享到QZone回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/addShareResponse.exp success * 错误返回示例: \snippet example/addShareResponse.exp fail */ - (void)addShareResponse:(APIResponse*) response; /** * 在QZone相册中创建一个新的相册回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/addAlbumResponse.exp success * 错误返回示例: \snippet example/addAlbumResponse.exp fail */ - (void)addAlbumResponse:(APIResponse*) response; /** * 上传照片到QZone指定相册回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/uploadPicResponse.exp success * 错误返回示例: \snippet example/uploadPicResponse.exp fail */ - (void)uploadPicResponse:(APIResponse*) response; /** * 在QZone中发表一篇日志回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/addOneBlogResponse.exp success * 错误返回示例: \snippet example/addOneBlogResponse.exp fail */ - (void)addOneBlogResponse:(APIResponse*) response; /** * 在QZone中发表一条说说回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/addTopicResponse.exp success * 错误返回示例: \snippet example/addTopicResponse.exp fail */ - (void)addTopicResponse:(APIResponse*) response; /** * 设置QQ头像回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/setUserHeadpicResponse.exp success * 错误返回示例: \snippet example/setUserHeadpicResponse.exp fail */ - (void)setUserHeadpicResponse:(APIResponse*) response; /** * 获取QQ会员信息回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse * \remarks 正确返回示例: \snippet example/getVipInfoResponse.exp success * 错误返回示例: \snippet example/getVipInfoResponse.exp fail */ - (void)getVipInfoResponse:(APIResponse*) response; /** * 获取QQ会员详细信息回调 * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse */ - (void)getVipRichInfoResponse:(APIResponse*) response; /** * sendStory分享的回调(已废弃,使用responseDidReceived:forMessage:) * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse */ - (void)sendStoryResponse:(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 @optional - (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; - (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit; - (BOOL) tencentWebViewShouldAutorotateWithWebkit; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuthObject.h ================================================ /// /// \file TencentOAuthObject.h /// 对开放接口的调用提供参数字典封装的辅助类 /// /// Created by Tencent on 12-12-28. /// Copyright (c) 2012年 Tencent. All rights reserved. /// #import #import #import "sdkdef.h" #pragma mark - #pragma mark TCAddTopicDic /** * \brief 发表说说的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCAddTopicDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * \note 不用释放,返回的对象是自动释放的 */ + (TCAddTopicDic *) dictionary; /** * 发布心情时引用的信息的类型。 * \note 1表示图片; 2表示网页; 3表示视频 */ @property (nonatomic, retain) TCOptionalStr paramRichtype; /** * 发布心情时引用的信息的值。有richtype时必须有richval * * \note * -# 当richtype为图片(即richtype为1,应用场景为发布心情时引用某张图片)时,\n * richval需要传入该图片的相关参数。引用的图片来源分为两种:一种为网站图片,\n * 一种为QQ空间相册中的某张图片。 * - 当引用的图片来自网站,richval包含下列参数的值:\n * | 参数名称 | 是否必须 | 类型 | 描述 | * | ------ | ------- | ------ | ----------------- | * | url | 必须 | string | 网站图片的URL | * | height | 必须 | string | 图片高度,单位: px | * | width | 必须 | string | 图片宽度,单位: px | * \n * 输入时每个值中间用“&”分隔,如下所示:\n * “url=http://qq.com/logo.png&width=25&height=21” * * - 当引用的图片来自QQ空间相册,richval包含下列参数的值。\n * 这些值都需要通过调用相册OpenAPI来获得。参数意义如下:\n * | 参数名称 | 是否必须 | 类型 | 描述 | * | --------- | ------ | ------ | ---------------------------------- | * | albumid | 必须 | string | 图片所属空间相册的ID | * | pictureid | 必须 | string | 图片ID | * | sloc | 必须 | string | 小图ID | * | pictype | | string | 图片类型(JPG = 1;GIF = 2;PNG = 3) | * | picheight | | string | 图片高度,单位: px | * | picwidth | | string | 图片宽度,单位: px | * 输入时每个值中间用逗号分隔,如下所示 :\n * “albumid,pictureid,sloc,pictype,picheight,picwidth” * -# 当richtype为网页(即richtype为2,应用场景为针对某网页发表评论)时,\n * richval需要传入该网页的URL,发表为feeds时,后台会自动将该URL转换为短URL。 * -# 当richtype为视频(即richtype为3,应用场景为针对某视频发表评论)时,\n * richval需要传入该视频的URL,发表为feeds时,后台会对该URL进行解析,\n * 在feeds上显示播放器,视频源及缩略图。 */ @property (nonatomic, retain) TCOptionalStr paramRichval; /** * 发布的心情的内容。 */ @property (nonatomic, retain) TCRequiredStr paramCon; /** * 地址文。例如:广东省深圳市南山区高新科技园腾讯大厦。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 */ @property (nonatomic, retain) TCOptionalStr paramLbs_nm; /** * 经度。-180.0到+180.0,+表示东经。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 */ @property (nonatomic, retain) TCOptionalStr paramLbs_x; /** * 纬度。-90.0到+90.0,+表示北纬。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 */ @property (nonatomic, retain) TCOptionalStr paramLbs_y; /** * 第三方应用的平台类型。 * \note 1表示QQ空间; 2表示腾讯朋友; 3表示腾讯微博平台; 4表示腾讯Q+平台。 */ @property (nonatomic, retain) TCOptionalStr paramThirdSource; @end #pragma mark - #pragma mark TCAddOneBlogDic /** * \brief 发表日志的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCAddOneBlogDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * \note 不用释放,返回的对象是自动释放的 */ + (TCAddOneBlogDic *) dictionary; /** * 日志标题(纯文本,最大长度128个字节,utf-8编码)。 */ @property (nonatomic, retain) TCRequiredStr paramTitle; /** * content 文章内容(html数据,最大长度100*1024个字节,utf-8编码) */ @property (nonatomic, retain) TCRequiredStr paramContent; @end #pragma mark - #pragma mark TCAddAlbumDic /** * \brief 创建空间相册的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCAddAlbumDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * * \note 不用释放,返回的对象是自动释放的 */ + (TCAddAlbumDic *) dictionary; /** * albumname 必须 string 相册名 不能超过30个字符。 */ @property (nonatomic, retain) TCRequiredStr paramAlbumname; /** * albumdesc string 相册描述,不能超过200个字符。 */ @property (nonatomic, retain) TCOptionalStr paramAlbumdesc; /** * priv string 相册权限 * * \note 其取值含义为: 1=公开;3=只主人可见; 4=QQ好友可见; 5=问答加密。\n * 不传则相册默认为公开权限。\n * 如果priv取值为5,即相册是问答加密的,则必须包含问题和答案两个参数:\n * - question: 问题,不能超过30个字符。 * - answer: 答案,不能超过30个字符。 */ @property (nonatomic, retain) TCOptionalStr paramPriv; /** * question 问题,不能超过30个字符。 * \note 如果priv取值为5,必须包含这个参数: **/ @property (nonatomic, retain) TCOptionalStr paramQuestion; /** * answer 答案,不能超过30个字符。 * \note 如果priv取值为5,必须包含这个参数: **/ @property (nonatomic, retain) TCOptionalStr paramAnswer; @end #pragma mark - #pragma mark TCUploadPicDic /** * \brief 上传一张照片到QQ空间相册的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCUploadPicDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * \note 不用释放,返回的对象是自动释放的 */ + (TCUploadPicDic *) dictionary; /** * photodesc string 照片描述,注意照片描述不能超过200个字符。 */ @property (nonatomic, retain) TCOptionalStr paramPhotodesc; /** * string 照片的命名,必须以.jpg, .gif, .png, .jpeg, .bmp此类后缀结尾。 */ @property (nonatomic, retain) TCOptionalStr paramTitle; /** * string 相册id。可不填,不填时则根据“mobile”标识选择默认上传的相册。 */ @property (nonatomic, retain) TCOptionalStr paramAlbumid; /** * 标志位 * * \note 0表示PC,1表示手机。用于当不传相册id时(即albumid为空时)控制是否传到手机相册。\n * -# 如果传1,则当albumid为空时,图片会上传到手机相册; * -# 如果不传或传0,则当albumid为空时,图片会上传到贴图相册; */ @property (nonatomic, assign) TCOptionalStr paramMobile; /** * x string 照片拍摄时的地理位置的经度。请使用原始数据(纯经纬度,0-360)。 */ @property (nonatomic, retain) TCOptionalStr paramX; /** * y string 照片拍摄时的地理位置的纬度。请使用原始数据(纯经纬度,0-360)。 */ @property (nonatomic, retain) TCOptionalStr paramY; /** * picture 必须 string 上传照片的文件名以及图片的内容(在发送请求时,图片内容以二进制数据流的形式发送,见下面的请求示例),注意照片名称不能超过30个字符。 */ @property (nonatomic, retain) TCRequiredImage paramPicture; /** * needfeed int 标识上传照片时是否要发feed * \note(0:不发feed; 1:发feed)。如果不填则默认为发feed。 */ @property (nonatomic, assign)TCOptionalStr paramNeedfeed; /** * successnum int 批量上传照片时,已成功上传的张数,指明上传完成情况。 * \note 单张上传时可以不填,不填则默认为0。 */ @property (nonatomic, assign)TCOptionalStr paramSuccessnum; /** * picnum int 批量上传照片的总张数,如果不填则默认为1。 * \note * - 如果picnum=1,为单张上传,发送单张上传feed; * - 如果picnum>1,为批量上传,发送批量上传feed。 * 批量上传方式:picnum为一次上传照片的张数,successnum初始值为0,每调用一次照片上传接口后递增其值。 * 信息中心中的feed表现形式:批量上传时最新的7张在feed中展示。其中最新上传的一张图片展示为大图,剩下的 * 六张按从新到旧的顺序展示为小图,其他图片不在feed中展示。 */ @property (nonatomic, assign)TCOptionalStr paramPicnum; @end #pragma mark - #pragma mark TCAddShareDic /** * \brief 同步分享到QQ空间,腾讯微博的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCAddShareDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * * \note 不用释放,返回的对象是自动释放的 */ + (TCAddShareDic *) dictionary; /** * title 必须 string feeds的标题 最长36个中文字,超出部分会被截断。 */ @property (nonatomic, retain) TCRequiredStr paramTitle; /** * url 必须 string 分享所在网页资源的链接,点击后跳转至第三方网页,对应上文接口说明中2的超链接。请以http://开头。 */ @property (nonatomic, retain) TCRequiredStr paramUrl; /** * comment string 用户评论内容,也叫发表分享时的分享理由 禁止使用系统生产的语句进行代替。 * 最长40个中文字,超出部分会被截断。 */ @property (nonatomic, retain) TCOptionalStr paramComment; /** * summary string 所分享的网页资源的摘要内容,或者是网页的概要描述 最长80个中文字,超出部分会被截断。 */ @property (nonatomic, retain) TCOptionalStr paramSummary; /** * images string 所分享的网页资源的代表性图片链接",请以http://开头,长度限制255字符。多张图片以竖线(|)分隔,目前只有第一张图片有效,图片规格100*100为佳。 */ @property (nonatomic, retain) TCOptionalStr paramImages; /** * type string 分享内容的类型。 * * \note 4表示网页;5表示视频(type=5时,必须传入playurl) */ @property (nonatomic, retain) TCOptionalStr paramType; /** * playurl string 长度限制为256字节。仅在type=5的时候有效,表示视频的swf播放地址。 */ @property (nonatomic, retain) TCOptionalStr paramPlayurl; /** * site 必须 string 分享的来源网站名称,请填写网站申请接入时注册的网站名称 */ @property (nonatomic, retain) TCRequiredStr paramSite; /** * fromurl 必须 string 分享的来源网站对应的网站地址url 请以http://开头。 */ @property (nonatomic, retain) TCRequiredStr paramFromurl; /** * nswb string 值为1时,表示分享不默认同步到微博,其他值或者不传此参数表示默认同步到微博。 */ @property (nonatomic, retain) TCOptionalStr paramNswb; @end #pragma mark - #pragma mark TCCheckPageFansDic /** * \brief 验证是否认证空间粉丝tttyttyyyu的参数字典定义 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCCheckPageFansDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * * \note 不用释放,返回的对象是自动释放的 */ + (TCCheckPageFansDic *) dictionary; /** * 表示认证空间的QQ号码 */ @property (nonatomic, retain) TCRequiredStr paramPage_id; @end #pragma mark - #pragma mark TCSetUserHeadpic /** * \brief 设置用户头像 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCSetUserHeadpic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * \note 不用释放,返回的对象是自动释放的 */ + (TCSetUserHeadpic *) dictionary; /** * 设置用户头像的图片 */ @property (nonatomic, retain) TCRequiredImage paramImage; /** * 图片的文件名 */ @property (nonatomic, retain) TCOptionalStr paramFileName; @end #pragma mark - #pragma mark TCListPhotoDic /** * \brief 获取用户QQ空间相册中的照片列表 * * 可以直接填写相应参数后将对象当作参数传入API中 */ @interface TCListPhotoDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * * \note 不用释放,返回的对象是自动释放的 */ + (TCListPhotoDic *) dictionary; /** * 表示要获取的照片列表所在的相册ID */ @property (nonatomic, retain) TCRequiredStr paramAlbumid; @end #pragma mark - #pragma mark TCSendStoryDic /** * \brief QQ空间定向分享的参数字典定义 * * 该分享支持@到指定好友,最多支持10个好友。 * 其中第三方应用可预传最多5个指定好友的openid,其余好友由用户自行选择。 * 该分享形式仅提供跳QZone分享和本地Html5分享两种形式。 * sendStroy不支持userData参数 */ @interface TCSendStoryDic : TCAPIRequest /** * 返回一个对象用来进行API参数的填充 * * \note 不用释放,返回的对象是自动释放的 */ + (TCSendStoryDic *) dictionary; /** * 分享的标题 */ @property (nonatomic, retain) TCRequiredStr paramTitle; /** * 故事摘要,最多不超过50个汉字,可以为空 */ @property (nonatomic, retain) TCOptionalStr paramSummary; /** * 默认展示在输入框里的分享理由,最多120个汉字,可以为空 */ @property (nonatomic, retain) TCOptionalStr paramDescription; /** * 图片url */ @property (nonatomic, retain) TCOptionalStr paramPics; /** * 如果不填,则默认为"进入应用" */ @property (nonatomic, retain) TCRequiredStr paramAct; /** * 点击分享的Url */ @property (nonatomic, retain) TCOptionalStr paramShareUrl; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Headers/sdkdef.h ================================================ /// /// \file sdkdef.h /// \brief SDK中相关常量定义 /// /// Created by Tencent on 12-12-25. /// Copyright (c) 2012年 Tencent. All rights reserved. /// #import #import /** * \brief 设置sdk的log等级 */ typedef enum { TCOLogLevel_Disabled = -1, // 关闭所有log TCOLogLevel_Error = 0, TCOLogLevel_Warning, TCOLogLevel_Info, TCOLogLevel_Debug, } TCOLogLevel; /** * \brief 手机qq的当前版本 */ typedef enum QQVersion { kQQUninstall, kQQVersion3_0, kQQVersion4_0, //支持sso登陆 kQQVersion4_2_1, //ios7兼容 kQQVersion4_5, //4.5版本,wpa会话 kQQVersion4_6, //4.6版本,sso登陆信令通道切换 kQQVersion4_7, //4.7版本 不确定新支持了什么样的属性 } QQVersion; /** * \breif TIM的当前版本 */ typedef enum TIMVersion { kTIMUinstall, kTIMVersion1_1, }TIMVersion; /** * \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 { 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空间(需要申请权限) */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC; /** 发表一篇日志到QQ空间(需要申请权限) */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG; /** 创建一个QQ空间相册(需要申请权限) */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM; /** 上传一张照片到QQ空间相册(需要申请权限) */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC; /** 获取用户QQ空间相册列表(需要申请权限) */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM; /** 同步分享到QQ空间、腾讯微博 */ FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE; /** 验证是否认证空间粉丝 */ 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 @optional - (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Resources/ios_open_sdk_3.1.0.3_iphone ================================================ ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Resources/ios_open_sdk_3.1.3.1_iphone ================================================ ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.1.473_iphone_release ================================================ ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK/TencentOpenApi_IOS_Bundle.bundle/local.html ================================================ 社交渠道 ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK/WBHttpRequest+WeiboToken.h ================================================ // // WBHttpRequest+WeiboToken.h // WeiboSDK // // Created by DannionQiu on 14/11/6. // Copyright (c) 2014年 SINA iOS Team. All rights reserved. // #import "WBHttpRequest.h" @interface WBHttpRequest (WeiboToken) /*! @method @abstract 使用RefreshToken去换取新的身份凭证AccessToken. @discussion 在SSO授权登录后,服务器会下发有效期为7天的refreshToken以及有效期为1天的AccessToken。 当有效期为1天的AccessToken过期时,可以调用该接口带着refreshToken信息区换取新的AccessToken。 @param refreshToken refreshToken @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 */ + (WBHttpRequest *)requestForRenewAccessTokenWithRefreshToken:(NSString*)refreshToken queue:(NSOperationQueue*)queue withCompletionHandler:(WBRequestHandler)handler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK/WBHttpRequest.h ================================================ // // WBHttpRequest.h // WeiboSDK // // Created by DannionQiu on 14-9-18. // Copyright (c) 2014年 SINA iOS Team. All rights reserved. // #import #import #pragma mark - WBHttpRequest and WBHttpRequestDelegate @class WBHttpRequest; /** 接收并处理来自微博sdk对于网络请求接口的调用响应 以及logOutWithToken的请求 */ @protocol WBHttpRequestDelegate /** 收到一个来自微博Http请求的响应 @param response 具体的响应对象 */ @optional - (void)request:(WBHttpRequest *)request didReceiveResponse:(NSURLResponse *)response; /** 收到一个来自微博Http请求失败的响应 @param error 错误信息 */ @optional - (void)request:(WBHttpRequest *)request didFailWithError:(NSError *)error; /** 收到一个来自微博Http请求的网络返回 @param result 请求返回结果 */ @optional - (void)request:(WBHttpRequest *)request didFinishLoadingWithResult:(NSString *)result; /** 收到一个来自微博Http请求的网络返回 @param data 请求返回结果 */ @optional - (void)request:(WBHttpRequest *)request didFinishLoadingWithDataResult:(NSData *)data; /** 收到快速SSO授权的重定向 @param URI */ @optional - (void)request:(WBHttpRequest *)request didReciveRedirectResponseWithURI:(NSURL *)redirectUrl; @end /** 微博封装Http请求的消息结构 */ @interface WBHttpRequest : NSObject { NSURLConnection *connection; NSMutableData *responseData; } /** 用户自定义请求地址URL */ @property (nonatomic, strong) NSString *url; /** 用户自定义请求方式 支持"GET" "POST" */ @property (nonatomic, strong) NSString *httpMethod; /** 用户自定义请求参数字典 */ @property (nonatomic, strong) NSDictionary *params; /** WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 */ @property (nonatomic, weak) id delegate; /** 用户自定义TAG 用于区分回调Request */ @property (nonatomic, strong) NSString* tag; /** 统一HTTP请求接口 调用此接口后,将发送一个HTTP网络请求 @param url 请求url地址 @param httpMethod 支持"GET" "POST" @param params 向接口传递的参数结构 @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 */ + (WBHttpRequest *)requestWithURL:(NSString *)url httpMethod:(NSString *)httpMethod params:(NSDictionary *)params delegate:(id)delegate withTag:(NSString *)tag; /** 统一微博Open API HTTP请求接口 调用此接口后,将发送一个HTTP网络请求(用于访问微博open api) @param accessToken 应用获取到的accessToken,用于身份验证 @param url 请求url地址 @param httpMethod 支持"GET" "POST" @param params 向接口传递的参数结构 @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 */ + (WBHttpRequest *)requestWithAccessToken:(NSString *)accessToken url:(NSString *)url httpMethod:(NSString *)httpMethod params:(NSDictionary *)params delegate:(id)delegate withTag:(NSString *)tag; /** 取消网络请求接口 调用此接口后,将取消当前网络请求,建议同时[WBHttpRequest setDelegate:nil]; 注意:该方法只对使用delegate的request方法有效。无法取消任何使用block的request的网络请求接口。 */ - (void)disconnect; #pragma mark - block extension typedef void (^WBRequestHandler)(WBHttpRequest *httpRequest, id result, NSError *error); /** 统一微博Open API HTTP请求接口 调用此接口后,将发送一个HTTP网络请求(用于访问微博open api) @param url 请求url地址 @param httpMethod 支持"GET" "POST" @param params 向接口传递的参数结构 @param queue 发起请求的NSOperationQueue对象,如queue为nil,则在主线程([NSOperationQueue mainQueue])发起请求。 @param handler 接口请求返回调用的block方法 */ + (WBHttpRequest *)requestWithURL:(NSString *)url httpMethod:(NSString *)httpMethod params:(NSDictionary *)params queue:(NSOperationQueue*)queue withCompletionHandler:(WBRequestHandler)handler; /** 统一HTTP请求接口 调用此接口后,将发送一个HTTP网络请求 @param url 请求url地址 @param httpMethod 支持"GET" "POST" @param params 向接口传递的参数结构 @param queue 发起请求的NSOperationQueue对象,如queue为nil,则在主线程([NSOperationQueue mainQueue])发起请求。 @param handler 接口请求返回调用的block方法 */ + (WBHttpRequest *)requestWithAccessToken:(NSString *)accessToken url:(NSString *)url httpMethod:(NSString *)httpMethod params:(NSDictionary *)params queue:(NSOperationQueue*)queue withCompletionHandler:(WBRequestHandler)handler; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK/WeiboSDK+Statistics.h ================================================ // // WeiboSDK+Statistics.h // WeiboSDK // // Created by DannionQiu on 15/4/13. // Copyright (c) 2015年 SINA iOS Team. All rights reserved. // #import "WeiboSDK.h" @interface WeiboSDK(Statistics) /** 设置是否开启统计模式, 默认为NO. @param value 为YES, SDK会开启统计功能,记录日志,并在合适的实际传上服务器。 @return void. */ + (void)setStatisticsEnabled:(BOOL)value; #pragma mark - Optional Configs Setting /** 设置是否打印SDK的log信息, 默认NO(不打印log). @param value 设置为YES, WeiboSDK 会输出log信息可供调试参考. 除非特殊需要,否则发布产品时需改回NO. @return void. */ + (void)setStatisticsLogEnabled:(BOOL)value; /** 设置版本信息. @param version 版本号,为nil或@""时, 默认为Build号(CFBundleVersion) @return void. */ + (void)setVersion:(NSString*)version; /** 设置渠道信息. @param channelID 渠道名称, 为nil或@""时, 默认为@"AppStore"渠道 @return void. */ + (void)setChannelID:(NSString*)channelID; /** 设定日志上传的发送间隔 @param frequecy 单位为秒,最小30秒,最大8*60*60秒(8小时)。默认为180秒(3分钟) @return void. */ + (void)setUploadFrequecy:(NSTimeInterval)frequecy; #pragma mark - Statistics Api /** 自动页面时长统计, 开始记录某个页面展示时长. 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: @param pageName 统计的页面名称. @return void. */ + (void)beginLogPageView:(NSString *)pageName; /** 自动页面时长统计, 结束记录某个页面展示时长. 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: @param pageName 统计的页面名称. @return void. */ + (void)endLogPageView:(NSString *)pageName; /** 自动事件时长统计, 开始记录某个事示时长. 使用方法:调用event:函数来完成自动统计。 @param eventID 统计的事件标识符. @warning eventID不能使用空格和特殊字符,且长度不能超过255个字符(否则将截取前255个字符) */ + (void)event:(NSString *)eventID; /** 自动事件时长统计, 开始记录某个事示时长. 使用方法:调用event:函数来完成自动统计。 @param eventID 统计的事件标识符. @param pageName 事件发生时所在页面. @param userInfo 事件相关信息. @return void. @warning 每个event的userInfo不能超过10个 eventID、pageName、userInfo中key和value都不能使用空格和特殊字符,且长度不能超过255个字符(否则将截取前255个字符) */ + (void)event:(NSString *)eventID onPageView:(NSString*)pageName withUserInfo:(NSDictionary*)userInfo; /** 强制日志上传 调用后,若距离上次成功上传日志时间不小于30秒,立刻上传日志。 */ + (void)forceUploadRecords; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK/WeiboSDK.h ================================================ // // WeiboSDKHeaders.h // WeiboSDKDemo // // Created by Wade Cheng on 4/3/13. // Copyright (c) 2013 SINA iOS Team. All rights reserved. // #import #import #import "WBHttpRequest.h" #import "WBHttpRequest+WeiboToken.h" typedef NS_ENUM(NSInteger, WeiboSDKResponseStatusCode) { WeiboSDKResponseStatusCodeSuccess = 0,//成功 WeiboSDKResponseStatusCodeUserCancel = -1,//用户取消发送 WeiboSDKResponseStatusCodeSentFail = -2,//发送失败 WeiboSDKResponseStatusCodeAuthDeny = -3,//授权失败 WeiboSDKResponseStatusCodeUserCancelInstall = -4,//用户取消安装微博客户端 WeiboSDKResponseStatusCodePayFail = -5,//支付失败 WeiboSDKResponseStatusCodeShareInSDKFailed = -8,//分享失败 详情见response UserInfo WeiboSDKResponseStatusCodeUnsupport = -99,//不支持的请求 WeiboSDKResponseStatusCodeUnknown = -100, }; @protocol WeiboSDKDelegate; @protocol WBHttpRequestDelegate; @class WBBaseRequest; @class WBBaseResponse; @class WBMessageObject; @class WBImageObject; @class WBBaseMediaObject; @class WBHttpRequest; /** 微博SDK接口类 */ @interface WeiboSDK : NSObject /** 检查用户是否安装了微博客户端程序 @return 已安装返回YES,未安装返回NO */ + (BOOL)isWeiboAppInstalled; /** 检查用户是否可以通过微博客户端进行分享 @return 可以使用返回YES,不可以使用返回NO */ + (BOOL)isCanShareInWeiboAPP; /** 检查用户是否可以使用微博客户端进行SSO授权 @return 可以使用返回YES,不可以使用返回NO */ + (BOOL)isCanSSOInWeiboApp; /** 打开微博客户端程序 @return 成功打开返回YES,失败返回NO */ + (BOOL)openWeiboApp; /** 获取微博客户端程序的itunes安装地址 @return 微博客户端程序的itunes安装地址 */ + (NSString *)getWeiboAppInstallUrl; /** 获取当前微博SDK的版本号 @return 当前微博SDK的版本号 */ + (NSString *)getSDKVersion; extern NSString * const WeiboSDKGetAidSucessNotification; extern NSString * const WeiboSDKGetAidFailNotification; /** 获取当前微博SDK的aid 返回的aid值可能为 nil ,当值为 nil 时会尝试获取 aid 值。 当获取成功( aid 值变为有效值)时,SDK会发出名为 WeiboSDKGetAidSucessNotification 的通知,通知中带有 aid 值。 当获取失败时,SDK会发出名为 WeiboSDKGetAidFailNotification 的通知,通知中带有 NSError 对象。 @return aid 用于广告的与设备信息相关的标识符 */ + (NSString *)getWeiboAid; /** 向微博客户端程序注册第三方应用 @param appKey 微博开放平台第三方应用appKey @return 注册成功返回YES,失败返回NO */ + (BOOL)registerApp:(NSString *)appKey; /** 处理微博客户端程序通过URL启动第三方应用时传递的数据 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用 @param url 启动第三方应用的URL @param delegate WeiboSDKDelegate对象,用于接收微博触发的消息 @see WeiboSDKDelegate */ + (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; /** 发送请求给微博客户端程序,并切换到微博 请求发送给微博客户端程序之后,微博客户端程序会进行相关的处理,处理完成之后一定会调用 [WeiboSDKDelegate didReceiveWeiboResponse:] 方法将处理结果返回给第三方应用 @param request 具体的发送请求 @see [WeiboSDKDelegate didReceiveWeiboResponse:] @see WBBaseResponse */ + (BOOL)sendRequest:(WBBaseRequest *)request; /** 收到微博客户端程序的请求后,发送对应的应答给微博客户端端程序,并切换到微博 第三方应用收到微博的请求后,异步处理该请求,完成后必须调用该函数将应答返回给微博 @param response 具体的应答内容 @see WBBaseRequest */ + (BOOL)sendResponse:(WBBaseResponse *)response; /** 设置WeiboSDK的调试模式 当开启调试模式时,WeiboSDK会在控制台输出详细的日志信息,开发者可以据此调试自己的程序。默认为 NO @param enabled 开启或关闭WeiboSDK的调试模式 */ + (void)enableDebugMode:(BOOL)enabled; /** 取消授权,登出接口 调用此接口后,token将失效 @param token 第三方应用之前申请的Token @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 */ + (void)logOutWithToken:(NSString *)token delegate:(id)delegate withTag:(NSString*)tag; /** 呼起微博客户端或打开微博H5页面,SDK自动检测是否安装微博客户端,当调用SDK相关方法时: 有的话呼起微博客户端定位到对应界面; 没有的话打开 webView 加载相应的微博H5页面; @param uid 用户id */ //连接到指定用户的微博个人主页,连接后可进行加关注等互动 + (void)linkToUser:(NSString *)uid; //连接到指定的单条微博详情页,连接后可对这条微博进行转、评、赞等互动 + (void)linkToSingleBlog:(NSString *)uid blogID:(NSString *)mid; //连接到指定的微博头条文章页 + (void)linkToArticle:(NSString *)aid; //分享到微博 + (void)shareToWeibo:(NSString *)content; //评论指定的微博 + (void)commentToWeibo:(NSString *)mid; //连接到微博搜索内容流 + (void)linkToSearch:(NSString *)keyword; //连接到我的微博消息流 + (void)linkToTimeLine; //连接到我的微博个人主页 + (void)linkToProfile; @end /** 接收并处理来至微博客户端程序的事件消息 */ @protocol WeiboSDKDelegate /** 收到一个来自微博客户端程序的请求 收到微博的请求后,第三方应用应该按照请求类型进行处理,处理完后必须通过 [WeiboSDK sendResponse:] 将结果回传给微博 @param request 具体的请求对象 */ - (void)didReceiveWeiboRequest:(WBBaseRequest *)request; /** 收到一个来自微博客户端程序的响应 收到微博的响应后,第三方应用可以通过响应类型、响应的数据和 WBBaseResponse.userInfo 中的数据完成自己的功能 @param response 具体的响应对象 */ - (void)didReceiveWeiboResponse:(WBBaseResponse *)response; @end #pragma mark - DataTransferObject and Base Request/Response /** 微博客户端程序和第三方应用之间传输数据信息的基类 */ @interface WBDataTransferObject : NSObject /** 自定义信息字典,用于数据传输过程中存储相关的上下文环境数据 第三方应用给微博客户端程序发送 request 时,可以在 userInfo 中存储请求相关的信息。 @warning userInfo中的数据必须是实现了 `NSCoding` 协议的对象,必须保证能序列化和反序列化 @warning 序列化后的数据不能大于10M */ @property (nonatomic, strong) NSDictionary *userInfo; /** 发送该数据对象的SDK版本号 如果数据对象是自己生成的,则sdkVersion为当前SDK的版本号;如果是接收到的数据对象,则sdkVersion为数据发送方SDK版本号 */ @property (strong, nonatomic, readonly) NSString *sdkVersion; /** 当用户没有安装微博客户端程序时是否提示用户打开微博安装页面 如果设置为YES,当用户未安装微博时会弹出Alert询问用户是否要打开微博App的安装页面。默认为YES */ @property (nonatomic, assign) BOOL shouldOpenWeiboAppInstallPageIfNotInstalled; @end /** 微博SDK所有请求类的基类 */ @interface WBBaseRequest : WBDataTransferObject /** 返回一个 WBBaseRequest 对象 @return 返回一个*自动释放的*WBBaseRequest对象 */ + (id)request; @end /** 微博SDK所有响应类的基类 */ @interface WBBaseResponse : WBDataTransferObject /** 对应的 request 中的自定义信息字典 如果当前 response 是由微博客户端响应给第三方应用的,则 requestUserInfo 中会包含原 request.userInfo 中的所有数据 @see WBBaseRequest.userInfo */ @property (strong, nonatomic, readonly) NSDictionary *requestUserInfo; /** 响应状态码 第三方应用可以通过statusCode判断请求的处理结果 */ @property (nonatomic, assign) WeiboSDKResponseStatusCode statusCode; /** 返回一个 WBBaseResponse 对象 @return 返回一个*自动释放的*WBBaseResponse对象 */ + (id)response; @end #pragma mark - Authorize Request/Response /** 第三方应用向微博客户端请求认证的消息结构 第三方应用向微博客户端申请认证时,需要调用 [WeiboSDK sendRequest:] 函数, 向微博客户端发送一个 WBAuthorizeRequest 的消息结构。 微博客户端处理完后会向第三方应用发送一个结构为 WBAuthorizeResponse 的处理结果。 */ @interface WBAuthorizeRequest : WBBaseRequest /** 微博开放平台第三方应用授权回调页地址,默认为`http://` 参考 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#.E5.AE.A2.E6.88.B7.E7.AB.AF.E9.BB.98.E8.AE.A4.E5.9B.9E.E8.B0.83.E9.A1.B5 @warning 必须保证和在微博开放平台应用管理界面配置的“授权回调页”地址一致,如未进行配置则默认为`http://` @warning 不能为空,长度小于1K */ @property (nonatomic, strong) NSString *redirectURI; /** 微博开放平台第三方应用scope,多个scrope用逗号分隔 参考 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#scope @warning 长度小于1K */ @property (nonatomic, strong) NSString *scope; /** 当用户没有安装微博客户端或微博客户端过低无法支持SSO的时候是否弹出SDK自带的Webview进行授权 如果设置为YES,当用户没有安装微博客户端或微博客户端过低无法支持SSO的时候会自动弹出SDK自带的Webview进行授权。 如果设置为NO,会根据 shouldOpenWeiboAppInstallPageIfNotInstalled 属性判断是否弹出安装/更新微博的对话框 默认为YES */ @property (nonatomic, assign) BOOL shouldShowWebViewForAuthIfCannotSSO; @end /** 微博客户端处理完第三方应用的认证申请后向第三方应用回送的处理结果 WBAuthorizeResponse 结构中仅包含常用的 userID 、accessToken 和 expirationDate 信息,其他的认证信息(比如部分应用可以获取的 refresh_token 信息)会统一存放到 userInfo 中 */ @interface WBAuthorizeResponse : WBBaseResponse /** 用户ID */ @property (nonatomic, strong) NSString *userID; /** 认证口令 */ @property (nonatomic, strong) NSString *accessToken; /** 认证过期时间 */ @property (nonatomic, strong) NSDate *expirationDate; /** 当认证口令过期时用于换取认证口令的更新口令 */ @property (nonatomic, strong) NSString *refreshToken; @end #pragma mark - ProvideMessageForWeibo Request/Response /** 微博客户端向第三方程序请求提供内容的消息结构 */ @interface WBProvideMessageForWeiboRequest : WBBaseRequest @end /** 微博客户端向第三方应用请求提供内容,第三方应用向微博客户端返回的消息结构 */ @interface WBProvideMessageForWeiboResponse : WBBaseResponse /** 提供给微博客户端的消息 */ @property (nonatomic, strong) WBMessageObject *message; /** 返回一个 WBProvideMessageForWeiboResponse 对象 @param message 需要回送给微博客户端程序的消息对象 @return 返回一个*自动释放的*WBProvideMessageForWeiboResponse对象 */ + (id)responseWithMessage:(WBMessageObject *)message; @end #pragma mark - SendMessageToWeibo Request/Response /** 第三方应用发送消息至微博客户端程序的消息结构体 */ @interface WBSendMessageToWeiboRequest : WBBaseRequest /** 发送给微博客户端的消息 */ @property (nonatomic, strong) WBMessageObject *message; /** 返回一个 WBSendMessageToWeiboRequest 对象 此方法生成对象被[WeiboSDK sendRequest:]会唤起微博客户端的发布器进行分享,如果未安装微博客户端或客户端版本太低 会根据 shouldOpenWeiboAppInstallPageIfNotInstalled 属性判断是否弹出安装/更新微博的对话框 @param message 需要发送给微博客户端的消息对象 @return 返回一个*自动释放的*WBSendMessageToWeiboRequest对象 */ + (id)requestWithMessage:(WBMessageObject *)message; /** 返回一个 WBSendMessageToWeiboRequest 对象 当用户安装了可以支持微博客户端內分享的微博客户端时,会自动唤起微博并分享 当用户没有安装微博客户端或微博客户端过低无法支持通过客户端內分享的时候会自动唤起SDK內微博发布器 @param message 需要发送给微博的消息对象 @param authRequest 授权相关信息,与access_token二者至少有一个不为空,当access_token为空并且需要弹出SDK內发布器时会通过此信息先进行授权后再分享 @param access_token 第三方应用之前申请的Token,当此值不为空并且无法通过客户端分享的时候,会使用此token进行分享。 @return 返回一个*自动释放的*WBSendMessageToWeiboRequest对象 */ + (id)requestWithMessage:(WBMessageObject *)message authInfo:(WBAuthorizeRequest *)authRequest access_token:(NSString *)access_token; @end /** WBSendMessageToWeiboResponse */ @interface WBSendMessageToWeiboResponse : WBBaseResponse /** 可能在分享过程中用户进行了授权操作,当此值不为空时,为用户相应授权信息 */ @property (nonatomic,strong) WBAuthorizeResponse *authResponse; @end #pragma mark - MessageObject / ImageObject /** 微博客户端程序和第三方应用之间传递的消息结构 一个消息结构由三部分组成:文字、图片和多媒体数据。三部分内容中至少有一项不为空,图片和多媒体数据不能共存。 */ @interface WBMessageObject : NSObject /** 消息的文本内容 @warning 长度小于2000个汉字 */ @property (nonatomic, strong) NSString *text; /** 消息的图片内容 @see WBImageObject */ @property (nonatomic, strong) WBImageObject *imageObject; /** 消息的多媒体内容 @see WBBaseMediaObject */ @property (nonatomic, strong) WBBaseMediaObject *mediaObject; /** 返回一个 WBMessageObject 对象 @return 返回一个*自动释放的*WBMessageObject对象 */ + (id)message; @end /** 消息中包含的图片数据对象 */ @interface WBImageObject : NSObject /** 图片真实数据内容 @warning 大小不能超过10M */ @property (nonatomic, strong) NSData *imageData; /** 返回一个 WBImageObject 对象 @return 返回一个*自动释放的*WBImageObject对象 */ + (id)object; /** 返回一个 UIImage 对象 @return 返回一个*自动释放的*UIImage对象 */ - (UIImage *)image; @end #pragma mark - Message Media Objects /** 消息中包含的多媒体数据对象基类,该类后期会被废弃,在发布器不再显示为linkcard样式,只显示为普通网络连接 */ @interface WBBaseMediaObject : NSObject /** 对象唯一ID,用于唯一标识一个多媒体内容 当第三方应用分享多媒体内容到微博时,应该将此参数设置为被分享的内容在自己的系统中的唯一标识 @warning 不能为空,长度小于255 */ @property (nonatomic, strong) NSString *objectID; /** 多媒体内容标题 @warning 不能为空且长度小于1k */ @property (nonatomic, strong) NSString *title; /** 多媒体内容描述 @warning 长度小于1k */ @property (nonatomic, strong) NSString *description; /** 多媒体内容缩略图 @warning 大小小于32k */ @property (nonatomic, strong) NSData *thumbnailData; /** 点击多媒体内容之后呼起第三方应用特定页面的scheme @warning 长度小于255 */ @property (nonatomic, strong) NSString *scheme; /** 返回一个 WBBaseMediaObject 对象 @return 返回一个*自动释放的*WBBaseMediaObject对象 */ + (id)object; @end #pragma mark - Message WebPage Objects /** 消息中包含的网页数据对象 */ @interface WBWebpageObject : WBBaseMediaObject /** 网页的url地址 @warning 不能为空且长度不能超过255 */ @property (nonatomic, strong) NSString *webpageUrl; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK/libWeiboSDK.a ================================================ [File too large to display: 16.4 MB] ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK/README.txt ================================================ 重要! SDK1.7.8 1 SDK分享小程序支持大图 SDK1.7.7 1 增加SDK分享小程序 2 增加选择发票接口 SDK1.7.6 1. 提高稳定性 1 修复mta崩溃 2 新增接口支持开发者关闭mta数据统计上报 SDK1.7.5 1. 提高稳定性 2. 加快registerApp接口启动速度 SDK1.7.4 1. 更新支持iOS启用 ATS(App Transport Security) 2. 需要在工程中链接CFNetwork.framework 3. 在工程配置中的”Other Linker Flags”中加入”-Objc -all_load” SDK1.7.3 1. 增强稳定性,适配iOS10 2. 修复小于32K的jpg格式缩略图设置失败的问题 SDK1.7.2 1. 修复因CTTeleponyNetworkInfo引起的崩溃问题 SDK1.7.1 1. 支持兼容ipv6(提升稳定性) 2. xCode Version 7.3.1 (7D1014) 编译 SDK1.7 1. 支持兼容ipv6 2. 修复若干问题增强稳定性 SDK1.6.3 1. xCode7.2 构建的sdk包。 2. 请使用xCode7.2进行编译。 3. 需要在Build Phases中Link Security.framework 4. 修复若干小问题。 SDK1.6.2 1、xCode7.1 构建的sdk包 2、请使用xCode7.1进行编译 SDK1.6.1 1、修复armv7s下,bitcode可能编译不过 2、解决warning SDK1.6 1、iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。 受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码: LSApplicationQueriesSchemes weixin NSAppTransportSecurity NSAllowsArbitraryLoads 2、开发者需要在工程中链接上 CoreTelephony.framework 3、解决bitcode编译不过问题 SDK1.5 1、废弃safeSendReq:接口,使用sendReq:即可。 2、新增+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate; 支持未安装微信情况下Auth,具体见WXApi.h接口描述 3、微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib。 ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK/WXApi.h ================================================ // // WXApi.h // 所有Api接口 // // Created by Wechat on 12-2-28. // Copyright (c) 2012年 Tencent. All rights reserved. // #import #import "WXApiObject.h" #pragma mark - WXApiDelegate /*! @brief 接收并处理来自微信终端程序的事件消息 * * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。 * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。 */ @protocol WXApiDelegate @optional /*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果 * * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。 * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。 * @param req 具体请求内容,是自动释放的 */ -(void) onReq:(BaseReq*)req; /*! @brief 发送一个sendReq后,收到微信的回应 * * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。 * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。 * @param resp具体的回应内容,是自动释放的 */ -(void) onResp:(BaseResp*)resp; @end #pragma mark - WXApi /*! @brief 微信Api接口函数类 * * 该类封装了微信终端SDK的所有接口 */ @interface WXApi : NSObject /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 * * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现,默认开启MTA数据上报。 * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 * @attention 请保证在主线程中调用此函数 * @param appid 微信开发者ID * @param typeFlag 应用支持打开的文件类型 * @return 成功返回YES,失败返回NO。 */ +(BOOL) registerApp:(NSString *)appid; /*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 * * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 * @attention 请保证在主线程中调用此函数 * @param appid 微信开发者ID * @param isEnableMTA 是否支持MTA数据上报 * @return 成功返回YES,失败返回NO。 */ +(BOOL) registerApp:(NSString *)appid enableMTA:(BOOL)isEnableMTA; /*! @brief WXApi的成员函数,向微信终端程序注册应用支持打开的文件类型。 * * 需要在每次启动第三方应用程序时调用。调用后并第一次成功分享数据到微信后,会在微信的可用应用列表中出现。 * @see registerApp * @param typeFlag 应用支持打开的数据类型, enAppSupportContentFlag枚举类型 “|” 操作后结果 */ +(void) registerAppSupportContentFlag:(UInt64)typeFlag; /*! @brief 处理微信通过URL启动App时传递的数据 * * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 * @param url 微信启动第三方应用时传递过来的URL * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 * @return 成功返回YES,失败返回NO。 */ +(BOOL) handleOpenURL:(NSURL *) url delegate:(id) delegate; /*! @brief 检查微信是否已被用户安装 * * @return 微信已安装返回YES,未安装返回NO。 */ +(BOOL) isWXAppInstalled; /*! @brief 判断当前微信的版本是否支持OpenApi * * @return 支持返回YES,不支持返回NO。 */ +(BOOL) isWXAppSupportApi; /*! @brief 获取微信的itunes安装地址 * * @return 微信的安装地址字符串。 */ +(NSString *) getWXAppInstallUrl; /*! @brief 获取当前微信SDK的版本号 * * @return 返回当前微信SDK的版本号 */ +(NSString *) getApiVersion; /*! @brief 打开微信 * * @return 成功返回YES,失败返回NO。 */ +(BOOL) openWXApp; /*! @brief 发送请求到微信,等待微信返回onResp * * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型 * SendAuthReq、SendMessageToWXReq等。 * @param req 具体的发送请求,在调用函数后,请自己释放。 * @return 成功返回YES,失败返回NO。 */ +(BOOL) sendReq:(BaseReq*)req; /*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp * * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。 * @param req 具体的发送请求,在调用函数后,请自己释放。 * @param viewController 当前界面对象。 * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 * @return 成功返回YES,失败返回NO。 */ +(BOOL) sendAuthReq:(SendAuthReq*)req viewController:(UIViewController*)viewController delegate:(id)delegate; /*! @brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 * * 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 * GetMessageFromWXResp、ShowMessageFromWXResp等。 * @param resp 具体的应答内容,调用函数后,请自己释放 * @return 成功返回YES,失败返回NO。 */ +(BOOL) sendResp:(BaseResp*)resp; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK/WXApiObject.h ================================================ // // MMApiObject.h // Api对象,包含所有接口和对象数据定义 // // Created by Wechat on 12-2-28. // Copyright (c) 2012年 Tencent. All rights reserved. // #import #import /*! @brief 错误码 * */ enum WXErrCode { WXSuccess = 0, /**< 成功 */ WXErrCodeCommon = -1, /**< 普通错误类型 */ WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ WXErrCodeSentFail = -3, /**< 发送失败 */ WXErrCodeAuthDeny = -4, /**< 授权失败 */ WXErrCodeUnsupport = -5, /**< 微信不支持 */ }; /*! @brief 请求发送场景 * */ enum WXScene { WXSceneSession = 0, /**< 聊天界面 */ WXSceneTimeline = 1, /**< 朋友圈 */ WXSceneFavorite = 2, /**< 收藏 */ }; enum WXAPISupport { WXAPISupportSession = 0, }; /*! @brief 跳转profile类型 * */ enum WXBizProfileType{ WXBizProfileType_Normal = 0, //**< 普通公众号 */ WXBizProfileType_Device = 1, //**< 硬件公众号 */ }; /*! @brief 跳转mp网页类型 * */ enum WXMPWebviewType { WXMPWebviewType_Ad = 0, /**< 广告网页 **/ }; /*! @brief 应用支持接收微信的文件类型 * */ typedef NS_ENUM(UInt64, enAppSupportContentFlag) { MMAPP_SUPPORT_NOCONTENT = 0x0, MMAPP_SUPPORT_TEXT = 0x1, MMAPP_SUPPORT_PICTURE = 0x2, MMAPP_SUPPORT_LOCATION = 0x4, MMAPP_SUPPORT_VIDEO = 0x8, MMAPP_SUPPORT_AUDIO = 0x10, MMAPP_SUPPORT_WEBPAGE = 0x20, // Suport File Type MMAPP_SUPPORT_DOC = 0x40, // doc MMAPP_SUPPORT_DOCX = 0x80, // docx MMAPP_SUPPORT_PPT = 0x100, // ppt MMAPP_SUPPORT_PPTX = 0x200, // pptx MMAPP_SUPPORT_XLS = 0x400, // xls MMAPP_SUPPORT_XLSX = 0x800, // xlsx MMAPP_SUPPORT_PDF = 0x1000, // pdf }; #pragma mark - BaseReq /*! @brief 该类为微信终端SDK所有请求类的基类 * */ @interface BaseReq : NSObject /** 请求类型 */ @property (nonatomic, assign) int type; /** 由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录*/ @property (nonatomic, retain) NSString* openID; @end #pragma mark - BaseResp /*! @brief 该类为微信终端SDK所有响应类的基类 * */ @interface BaseResp : NSObject /** 错误码 */ @property (nonatomic, assign) int errCode; /** 错误提示字符串 */ @property (nonatomic, retain) NSString *errStr; /** 响应类型 */ @property (nonatomic, assign) int type; @end #pragma mark - WXMediaMessage @class WXMediaMessage; #pragma mark - SendAuthReq /*! @brief 第三方程序向微信终端请求认证的消息结构 * * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数, * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 * @see SendAuthResp */ @interface SendAuthReq : BaseReq /** 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 * @see SendAuthResp * @note scope字符串长度不能超过1K */ @property (nonatomic, retain) NSString* scope; /** 第三方程序本身用来标识其请求的唯一性,最后跳转回第三方程序时,由微信终端回传。 * @note state字符串长度不能超过1K */ @property (nonatomic, retain) NSString* state; @end #pragma mark - SendAuthResp /*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。 * * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。 * 微信终端处理完后会向第三方程序发送一个SendAuthResp。 * @see onResp */ @interface SendAuthResp : BaseResp @property (nonatomic, retain) NSString* code; /** 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传 * @note state字符串长度不能超过1K */ @property (nonatomic, retain) NSString* state; @property (nonatomic, retain) NSString* lang; @property (nonatomic, retain) NSString* country; @end #pragma mark - SendMessageToWXReq /*! @brief 第三方程序发送消息至微信终端程序的消息结构体 * * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息, * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。 * @see SendMessageToWXResp */ @interface SendMessageToWXReq : BaseReq /** 发送消息的文本内容 * @note 文本长度必须大于0且小于10K */ @property (nonatomic, retain) NSString* text; /** 发送消息的多媒体内容 * @see WXMediaMessage */ @property (nonatomic, retain) WXMediaMessage* message; /** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ @property (nonatomic, assign) BOOL bText; /** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。 * @see WXScene */ @property (nonatomic, assign) int scene; @end #pragma mark - SendMessageToWXResp /*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。 * * 第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。 */ @interface SendMessageToWXResp : BaseResp @property(nonatomic, retain) NSString* lang; @property(nonatomic, retain) NSString* country; @end #pragma mark - GetMessageFromWXReq /*! @brief 微信终端向第三方程序请求提供内容的消息结构体。 * * 微信终端向第三方程序请求提供内容,微信终端会向第三方程序发送GetMessageFromWXReq消息结构体, * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。 */ @interface GetMessageFromWXReq : BaseReq @property (nonatomic, retain) NSString* lang; @property (nonatomic, retain) NSString* country; @end #pragma mark - GetMessageFromWXResp /*! @brief 微信终端向第三方程序请求提供内容,第三方程序向微信终端返回的消息结构体。 * * 微信终端向第三方程序请求提供内容,第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。 */ @interface GetMessageFromWXResp : BaseResp /** 向微信终端提供的文本内容 @note 文本长度必须大于0且小于10K */ @property (nonatomic, retain) NSString* text; /** 向微信终端提供的多媒体内容。 * @see WXMediaMessage */ @property (nonatomic, retain) WXMediaMessage* message; /** 向微信终端提供内容的消息类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ @property (nonatomic, assign) BOOL bText; @end #pragma mark - ShowMessageFromWXReq /*! @brief 微信通知第三方程序,要求第三方程序显示的消息结构体。 * * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 */ @interface ShowMessageFromWXReq : BaseReq /** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容 * @see WXMediaMessage */ @property (nonatomic, retain) WXMediaMessage* message; @property (nonatomic, retain) NSString* lang; @property (nonatomic, retain) NSString* country; @end #pragma mark - ShowMessageFromWXResp /*! @brief 微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。 * * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 */ @interface ShowMessageFromWXResp : BaseResp @end #pragma mark - LaunchFromWXReq /*! @brief 微信终端打开第三方程序携带的消息结构体 * * 微信向第三方发送的结构体,第三方不需要返回 */ @interface LaunchFromWXReq : BaseReq @property (nonatomic, retain) WXMediaMessage* message; @property (nonatomic, retain) NSString* lang; @property (nonatomic, retain) NSString* country; @end #pragma mark - OpenTempSessionReq /* ! @brief 第三方通知微信,打开临时会话 * * 第三方通知微信,打开临时会话 */ @interface OpenTempSessionReq : BaseReq /** 需要打开的用户名 * @attention 长度不能超过512字节 */ @property (nonatomic, retain) NSString* username; /** 开发者自定义参数,拉起临时会话后会发给开发者后台,可以用于识别场景 * @attention 长度不能超过32位 */ @property (nonatomic, retain) NSString* sessionFrom; @end #pragma mark - OpenTempSessionResp /*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。 * * 第三方程序向微信终端发送OpenTempSessionReq后,微信发送回来的处理结果,该结果用OpenTempSessionResp表示。 */ @interface OpenTempSessionResp : BaseResp @end #pragma mark - OpenWebviewReq /* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 * * 第三方通知微信启动内部浏览器,打开指定Url对应的网页 */ @interface OpenWebviewReq : BaseReq /** 需要打开的网页对应的Url * @attention 长度不能超过1024 */ @property(nonatomic,retain)NSString* url; @end #pragma mark - OpenWebviewResp /*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果 * * 第三方程序向微信终端发送OpenWebviewReq后,微信发送回来的处理结果,该结果用OpenWebviewResp表示 */ @interface OpenWebviewResp : BaseResp @end #pragma mark - OpenRankListReq /* ! @brief 第三方通知微信,打开硬件排行榜 * * 第三方通知微信,打开硬件排行榜 */ @interface OpenRankListReq : BaseReq @end #pragma mark - OpenRanklistResp /*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。 * * 第三方程序向微信终端发送OpenRankListReq后,微信发送回来的处理结果,该结果用OpenRankListResp表示。 */ @interface OpenRankListResp : BaseResp @end #pragma mark - JumpToBizProfileReq /* ! @brief 第三方通知微信,打开指定微信号profile页面 * * 第三方通知微信,打开指定微信号profile页面 */ @interface JumpToBizProfileReq : BaseReq /** 跳转到该公众号的profile * @attention 长度不能超过512字节 */ @property (nonatomic, retain) NSString* username; /** 如果用户加了该公众号为好友,extMsg会上传到服务器 * @attention 长度不能超过1024字节 */ @property (nonatomic, retain) NSString* extMsg; /** * 跳转的公众号类型 * @see WXBizProfileType */ @property (nonatomic, assign) int profileType; @end #pragma mark - JumpToBizWebviewReq /* ! @brief 第三方通知微信,打开指定usrname的profile网页版 * */ @interface JumpToBizWebviewReq : BaseReq /** 跳转的网页类型,目前只支持广告页 * @see WXMPWebviewType */ @property(nonatomic, assign) int webType; /** 跳转到该公众号的profile网页版 * @attention 长度不能超过512字节 */ @property(nonatomic, retain) NSString* tousrname; /** 如果用户加了该公众号为好友,extMsg会上传到服务器 * @attention 长度不能超过1024字节 */ @property(nonatomic, retain) NSString* extMsg; @end #pragma mark - WXCardItem @interface WXCardItem : NSObject /** 卡id * @attention 长度不能超过1024字节 */ @property (nonatomic,retain) NSString* cardId; /** ext信息 * @attention 长度不能超过2024字节 */ @property (nonatomic,retain) NSString* extMsg; /** * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 */ @property (nonatomic,assign) UInt32 cardState; /** * @attention req不需要填,chooseCard返回的。 */ @property (nonatomic,retain) NSString* encryptCode; /** * @attention req不需要填,chooseCard返回的。 */ @property (nonatomic,retain) NSString* appID; @end; #pragma mark - WXInvoiceItem @interface WXInvoiceItem : NSObject /** 卡id * @attention 长度不能超过1024字节 */ @property (nonatomic,retain) NSString* cardId; /** ext信息 * @attention 长度不能超过2024字节 */ @property (nonatomic,retain) NSString* extMsg; /** * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 */ @property (nonatomic,assign) UInt32 cardState; /** * @attention req不需要填,chooseCard返回的。 */ @property (nonatomic,retain) NSString* encryptCode; /** * @attention req不需要填,chooseCard返回的。 */ @property (nonatomic,retain) NSString* appID; @end #pragma mark - AddCardToWXCardPackageReq /* ! @brief 请求添加卡券至微信卡包 * */ @interface AddCardToWXCardPackageReq : BaseReq /** 卡列表 * @attention 个数不能超过40个 类型WXCardItem */ @property (nonatomic,retain) NSArray* cardAry; @end #pragma mark - AddCardToWXCardPackageResp /** ! @brief 微信返回第三方添加卡券结果 * */ @interface AddCardToWXCardPackageResp : BaseResp /** 卡列表 * @attention 个数不能超过40个 类型WXCardItem */ @property (nonatomic,retain) NSArray* cardAry; @end #pragma mark - WXChooseCardReq /* ! @brief 请求从微信选取卡券 * */ @interface WXChooseCardReq : BaseReq @property(nonatomic, strong) NSString *appID; @property(nonatomic, assign) UInt32 shopID; @property(nonatomic, assign) UInt32 canMultiSelect; @property(nonatomic, strong) NSString *cardType; @property(nonatomic, strong) NSString *cardTpID; @property(nonatomic, strong) NSString *signType; @property(nonatomic, strong) NSString *cardSign; @property(nonatomic, assign) UInt32 timeStamp; @property(nonatomic, strong) NSString *nonceStr; @end #pragma mark - WXChooseCardResp /** ! @brief 微信返回第三方请求选择卡券结果 * */ @interface WXChooseCardResp : BaseResp @property (nonatomic,retain) NSArray* cardAry; @end #pragma mark - WXChooseInvoiceReq /* ! @brief 请求从微信选取发票 * */ @interface WXChooseInvoiceReq : BaseReq @property (nonatomic, strong) NSString *appID; @property (nonatomic, assign) UInt32 shopID; @property (nonatomic, strong) NSString *signType; @property (nonatomic, strong) NSString *cardSign; @property (nonatomic, assign) UInt32 timeStamp; @property (nonatomic, strong) NSString *nonceStr; @end #pragma mark - WXChooseInvoiceResp /** ! @brief 微信返回第三方请求选择发票结果 * */ @interface WXChooseInvoiceResp : BaseResp @property (nonatomic, strong) NSArray* cardAry; @end #pragma mark - WXMediaMessage /*! @brief 多媒体消息结构体 * * 用于微信终端和第三方程序之间传递消息的多媒体消息内容 */ @interface WXMediaMessage : NSObject +(WXMediaMessage *) message; /** 标题 * @note 长度不能超过512字节 */ @property (nonatomic, retain) NSString *title; /** 描述内容 * @note 长度不能超过1K */ @property (nonatomic, retain) NSString *description; /** 缩略图数据 * @note 大小不能超过32K */ @property (nonatomic, retain) NSData *thumbData; /** * @note 长度不能超过64字节 */ @property (nonatomic, retain) NSString *mediaTagName; /** * */ @property (nonatomic, retain) NSString *messageExt; @property (nonatomic, retain) NSString *messageAction; /** * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。 */ @property (nonatomic, retain) id mediaObject; /*! @brief 设置消息缩略图的方法 * * @param image 缩略图 * @note 大小不能超过32K */ - (void) setThumbImage:(UIImage *)image; @end #pragma mark - WXImageObject /*! @brief 多媒体消息中包含的图片数据对象 * * 微信终端和第三方程序之间传递消息中包含的图片数据对象。 * @note imageData成员不能为空 * @see WXMediaMessage */ @interface WXImageObject : NSObject /*! @brief 返回一个WXImageObject对象 * * @note 返回的WXImageObject对象是自动释放的 */ +(WXImageObject *) object; /** 图片真实数据内容 * @note 大小不能超过10M */ @property (nonatomic, retain) NSData *imageData; @end #pragma mark - WXMusicObject /*! @brief 多媒体消息中包含的音乐数据对象 * * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。 * @note musicUrl和musicLowBandUrl成员不能同时为空。 * @see WXMediaMessage */ @interface WXMusicObject : NSObject /*! @brief 返回一个WXMusicObject对象 * * @note 返回的WXMusicObject对象是自动释放的 */ +(WXMusicObject *) object; /** 音乐网页的url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *musicUrl; /** 音乐lowband网页的url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *musicLowBandUrl; /** 音乐数据url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *musicDataUrl; /**音乐lowband数据url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *musicLowBandDataUrl; @end #pragma mark - WXVideoObject /*! @brief 多媒体消息中包含的视频数据对象 * * 微信终端和第三方程序之间传递消息中包含的视频数据对象。 * @note videoUrl和videoLowBandUrl不能同时为空。 * @see WXMediaMessage */ @interface WXVideoObject : NSObject /*! @brief 返回一个WXVideoObject对象 * * @note 返回的WXVideoObject对象是自动释放的 */ +(WXVideoObject *) object; /** 视频网页的url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *videoUrl; /** 视频lowband网页的url地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *videoLowBandUrl; @end #pragma mark - WXWebpageObject /*! @brief 多媒体消息中包含的网页数据对象 * * 微信终端和第三方程序之间传递消息中包含的网页数据对象。 * @see WXMediaMessage */ @interface WXWebpageObject : NSObject /*! @brief 返回一个WXWebpageObject对象 * * @note 返回的WXWebpageObject对象是自动释放的 */ +(WXWebpageObject *) object; /** 网页的url地址 * @note 不能为空且长度不能超过10K */ @property (nonatomic, retain) NSString *webpageUrl; @end #pragma mark - WXAppExtendObject /*! @brief 多媒体消息中包含的App扩展数据对象 * * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息, * 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。 * @note url,extInfo和fileData不能同时为空 * @see WXMediaMessage */ @interface WXAppExtendObject : NSObject /*! @brief 返回一个WXAppExtendObject对象 * * @note 返回的WXAppExtendObject对象是自动释放的 */ +(WXAppExtendObject *) object; /** 若第三方程序不存在,微信终端会打开该url所指的App下载地址 * @note 长度不能超过10K */ @property (nonatomic, retain) NSString *url; /** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 * @note 长度不能超过2K */ @property (nonatomic, retain) NSString *extInfo; /** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 * @note 大小不能超过10M */ @property (nonatomic, retain) NSData *fileData; @end #pragma mark - WXEmoticonObject /*! @brief 多媒体消息中包含的表情数据对象 * * 微信终端和第三方程序之间传递消息中包含的表情数据对象。 * @see WXMediaMessage */ @interface WXEmoticonObject : NSObject /*! @brief 返回一个WXEmoticonObject对象 * * @note 返回的WXEmoticonObject对象是自动释放的 */ +(WXEmoticonObject *) object; /** 表情真实数据内容 * @note 大小不能超过10M */ @property (nonatomic, retain) NSData *emoticonData; @end #pragma mark - WXFileObject /*! @brief 多媒体消息中包含的文件数据对象 * * @see WXMediaMessage */ @interface WXFileObject : NSObject /*! @brief 返回一个WXFileObject对象 * * @note 返回的WXFileObject对象是自动释放的 */ +(WXFileObject *) object; /** 文件后缀名 * @note 长度不超过64字节 */ @property (nonatomic, retain) NSString *fileExtension; /** 文件真实数据内容 * @note 大小不能超过10M */ @property (nonatomic, retain) NSData *fileData; @end #pragma mark - WXLocationObject /*! @brief 多媒体消息中包含的地理位置数据对象 * * 微信终端和第三方程序之间传递消息中包含的地理位置数据对象。 * @see WXMediaMessage */ @interface WXLocationObject : NSObject /*! @brief 返回一个WXLocationObject对象 * * @note 返回的WXLocationObject对象是自动释放的 */ +(WXLocationObject *) object; /** 地理位置信息 * @note 经纬度 */ @property (nonatomic, assign) double lng; //经度 @property (nonatomic, assign) double lat; //纬度 @end @interface WXMiniProgramObject : NSObject /*! @brief WXMiniProgramObject对象 * * @note 返回的WXMiniProgramObject对象是自动释放的 */ +(WXMiniProgramObject *) object; @property (nonatomic, strong) NSString *webpageUrl; //低版本网页链接 @property (nonatomic, strong) NSString *userName; //小程序username @property (nonatomic, strong) NSString *path; //小程序页面的路径 @property (nonatomic, strong) NSData *hdImageData; // 小程序新版本的预览图 128k @end #pragma mark - WXTextObject /*! @brief 多媒体消息中包含的文本数据对象 * * 微信终端和第三方程序之间传递消息中包含的文本数据对象。 * @see WXMediaMessage */ @interface WXTextObject : NSObject /*! @brief 返回一个WXTextObject对象 * * @note 返回的WXTextObject对象是自动释放的 */ +(WXTextObject *) object; /** 地理位置信息 * @note 文本内容 */ @property (nonatomic, retain) NSString *contentText; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK/WechatAuthSDK.h ================================================ // // WechatAuthSDK.h // WechatAuthSDK // // Created by 李凯 on 13-11-29. // Copyright (c) 2013年 Tencent. All rights reserved. // #import #import enum AuthErrCode { WechatAuth_Err_Ok = 0, //Auth成功 WechatAuth_Err_NormalErr = -1, //普通错误 WechatAuth_Err_NetworkErr = -2, //网络错误 WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败 WechatAuth_Err_Cancel = -4, //用户取消授权 WechatAuth_Err_Timeout = -5, //超时 }; @protocol WechatAuthAPIDelegate @optional - (void)onAuthGotQrcode:(UIImage *)image; //得到二维码 - (void)onQrcodeScanned; //二维码被扫描 - (void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode; //成功登录 @end @interface WechatAuthSDK : NSObject{ NSString *_sdkVersion; __weak id _delegate; } @property(nonatomic, weak) id delegate; @property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号 /*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调 * * @param appId 微信开发者ID * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同 * @param timeStamp 时间戳 * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔 * @param signature 签名 * @param schemeData 会在扫码后拼在scheme后 * @return 成功返回YES,失败返回NO 注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。 */ - (BOOL)Auth:(NSString *)appId nonceStr:(NSString *)nonceStr timeStamp:(NSString*)timeStamp scope:(NSString *)scope signature:(NSString *)signature schemeData:(NSString *)schemeData; /*! @brief 暂停登录请求 * * @return 成功返回YES,失败返回NO。 */ - (BOOL)StopAuth; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK/libWeChatSDK.a ================================================ [File too large to display: 13.6 MB] ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/Base.lproj/ShareSDK.strings ================================================ /* ShareSDKLocalizable.strings AppgoFramework Created by ShareSDK.cn on 13-1-14. 官网地址:http://www.mob.com 技术支持邮箱:support@sharesdk.cn 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 商务QQ:4006852216 Copyright (c) 2013年 ShareSDK.cn. All rights reserved. */ "AUTH_VIEW_TITLE" = "用户授权"; "AUTH_VIEW_CANCEL_BUTTON" = "取消"; "AUTH_VIEW_SIGN_IN" = "登录"; "AUTH_VIEW_ACCOUNT" = "帐号,如name@example.com"; "AUTH_VIEW_PASS" = "密码"; "AUTH_VIEW_ALERT_TITLE" = "提示"; "AUTH_VIEW_ALERT_CANCEL_BUTTON" = "知道了"; "AUTH_VIEW_INPUT_ACCOUNT" = "请输入登录帐号!"; "AUTH_VIEW_INPUT_PASSWORD" = "请输入登录密码!"; "AUTH_VIEW_UNAUTHORIZED" = "用户名或密码错误"; "SHARE_VIEW_DONE" = "完成"; "SHARE_VIEW_TITLE" = "分享"; "SMS_NEXT_TEXT" = "下一步"; "SMS_REGION_TEXT" = "国家/地区"; "SMS_PHONENUM_PLACEHOLDER_TEXT" = "请输入手机号码"; "SMS_LOGIN_TITLE" = "请输入您的手机号"; "SMS_DEF_COUNTRY" = "中国"; "SMS_CHOOSE_COUNTRY_TEXT" = "选择国家或地区"; "SMS_CHECK_PHONENUM_TEXT" = "确认手机号码"; "SMS_SURE_TEXT" = "好"; "SMS_CHECK_TEXT" = "我知道了"; "SMS_WILL_SEND_TEXT" = "我们将发送验证码短信到这个号码"; "SMS_PHONENUM_ERROR_TEXT" = "手机号码格式错误"; "SMS_PHONENUM_ERROR_MESSAGE" = "\n您输入的是一个无效手机号码\n请重新输入"; "SMS_DONE_TEXT" = "提交"; "SMS_CHECK_CODE_TITLE" = "验证码已发送,请填写验证码"; "SMS_PHONE_TEXT" = "手机号码"; "SMS_CHECKCODE_PLACEHOLDER_TEXT" = "请输入您的短信验证码"; "SMS_RESEND_TEXT" = "重新发送"; "SMS_BACK_TEXT" = "返回"; "SMS_WAIT_TEXT" = "等待"; "SMS_TITLE" = "短信登录"; "SMS_CODE_TEXT" = "验证码" "SMS_BACK_MESSAGE" = "验证码短信可能略有延迟,确定返回并重新开始?"; "SMS_VIOICE_MESSAGE" = "短信验证码收不到?请尝试"; "SMS_VIOICE_TEXT" = "语音验证码"; "SMS_VOICE_MESSAGE" = "我们将以电话的方式告知你验证码,请注意接听"; "SMS_Error_100" = "系统有点小问题,请稍后再试"; "SMS_Error_101" = "权限错误"; "SMS_Error_102" = "解密数据失败"; "SMS_Error_103" = "缺少必要参数"; "SMS_Error_104" = "请求数据非法"; "SMS_Error_105" = "验证码错误"; "SMS_Error_106" = "请求发送验证码失败"; "SMS_Error_107" = "该号码超过接受验证码上限次数,请明天再试"; "SMS_Error_108" = "该应用超过发送验证码上限次数"; "SMS_Error_109" = "发送验证码太频繁,请稍后再试"; "ShareSDK_Error_WechatMini" = "小程序分享只支持微信好友分享"; "ShareSDK_Error_WechatFile" = "微信朋友圈不支持文件分享"; "ShareSDK_Error_Register" = "传入参数 activePlatforms 类型错误"; "ShareSDK_Error_NORegister" = "尚未初始化SDK"; "ShareSDK_Error_Illegal" = "非法操作"; "ShareSDKConfigFile_Error_Illegal" = "无效的分享内容"; "ShareSDKConfigFile_Error_NOContentName" = "没有找到contentName节点"; "ShareSDKConfigFile_Error_NOXMLFile" = "没有找到ShareContent.xml文件"; "ShareSDKConfigFile_Error_XML" = "ShareContent.xml 没有寻找到有效子节点或xml格式不正确"; "ShareSDKConfigFile_Error_MOBAppKey" = "请在info.plist中填写正确的 MOBAppKey"; "ShareSDKExtension_Error_Platforms" = "没有指定要分享到哪些平台,无法进行分享"; "ShareSDKExtension_Error_Platform" = "无法分享到指定平台,该平台不支持一键分享操作"; "ShareSDKExtension_Error_NOAuthorize" = "用户尚未授权"; "ShareSDKExtension_Error_ClientInstalled" = "平台不支持检测客户端功能"; "ShareSDKConnector_Error_CLose" = "主动关闭"; "ShareSDKConnector_Error_Data" = "数据不完整"; "ShareSDKConnector_Error_Video" = "未找到指定视频数据"; "ShareSDKConnector_Error_Audio" = "未找到指定音频数据"; "ShareSDKConnector_Error_Read_Data" = "数据解析错误"; "ShareSDKConnector_Error_File" = "未找到指定资源"; "ShareSDKConnector_Error_NetVideo" = "暂不支持网络视频"; "ShareSDKConnector_Error_DownLoadPhoto" = "网络图片下载失败"; "ShareSDKConnector_Error_Twitter_Size" = "视频数据超过最大上传限制512M"; "ShareSDKConnector_Error_Twitter_Time" = "视频播放时间需要控制在 0.5 - 140.0 秒之间"; "ShareSDKConnector_Error_WeChat_NOLib" = "请将libWeChat.a导入项目并引入WXApi.h"; "ShareSDKConnector_Error_WeChat_NOShare" = "分享平台[微信]客户端不支持分享功能"; "ShareSDKConnector_Error_WeChat_NOClient" = "分享平台[微信]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_WeChat_NOLibShare" = "分享平台[微信]尚未导入libWeChatSDK.a库!无法进行相关操作"; "ShareSDKConnector_Error_Facebook_NOAppkey" = "appKey 未配置"; "ShareSDKConnector_Error_Facebook_ShareType" = "分享状态未知"; "ShareSDKConnector_Error_Facebook_DisplayName" = "分享平台[Facebook]进行客户端分享时请务必配置displayName"; "ShareSDKConnector_Error_Facebook_NOClient" = "分享平台[Facebook]尚未安装客户端!无法进行分享!"; "ShareSDKConnector_Error_FacebookMessager_NOClient" = "分享平台[Facebook Messenger]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_FacebookMessager_NOLibShare" = "分享平台[微信]尚未导入FBSDKMessengerShareKit.framework库!无法进行分享"; "ShareSDKConnector_Error_MeiPai_NOLib" = "请将MPShareSDK.framework导入项目中"; "ShareSDKConnector_Error_MeiPai_NOLibShare" = "分享平台[美拍]尚未导入MPShareSDK.framework库!无法进行相关操作"; "ShareSDKConnector_Error_MeiPai_NOShare" = "分享平台[美拍]客户端不支持此类分享功能"; "ShareSDKConnector_Error_MeiPai_NOShareVideo" = "分享平台[美拍]客户端版本不支持视频分享功能"; "ShareSDKConnector_Error_MeiPai_NOSharePhoto" = "分享平台[美拍]客户端版本不支持图片分享功能"; "ShareSDKConnector_Error_MeiPai_NOClient" = "分享平台[美拍]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_MeiPai_PhotoLibraryUsageDescription" = "未配置相册权限 NSPhotoLibraryUsageDescription 无法判定传入相册资源的类型 则统一使用图片类型分享"; "ShareSDKConnector_Error_DingTalk_NOLib" = "请将DTShareKit.framework导入项目"; "ShareSDKConnector_Error_DingTalk_NOLibShare" = "分享平台[钉钉]尚未导入DTShareKit.framework库!无法进行相关操作"; "ShareSDKConnector_Error_DingTalk_NOClient" = "分享平台[钉钉]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_DingTalk_NOShare" = "分享平台[钉钉]客户端不支持分享功能"; "ShareSDKConnector_Error_Yixin_NOLib" = "请将libYixinSDK.a导入项目并引入YXApi.h"; "ShareSDKConnector_Error_Yixin_Auth" = "[易信]授权失败"; "ShareSDKConnector_Error_Yixin_SSO" = "[易信]客户端不支持SSO授权功能"; "ShareSDKConnector_Error_Yixin_NOLibShare" = "分享平台[易信]尚未导入YXApi.a库!无法进行相关操作"; "ShareSDKConnector_Error_Yixin_NOShare" = "分享平台[易信]客户端不支持分享功能"; "ShareSDKConnector_Error_Yixin_NOClient" = "分享平台[易信]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_KaKao_NOLib" = "请将KakaoOpenAPI.framework导入项目并引入KOSession.h" "ShareSDKConnector_Error_KaKao_NOLibShare" = "分享平台[KaKao]尚未导入KakaoOpenSDK.framework! 无法进行相关操作"; "ShareSDKConnector_Error_KaKao_Callback" = "无效的回调请求"; "ShareSDKConnector_Error_KaKao_ShareTalk" = "[Kakao] 的Talk客户端分享失败,请检查分享参数" "ShareSDKConnector_Error_KaKao_Talk" = "分享平台[KaKao]不支持Talk客户端分享"; "ShareSDKConnector_Error_KaKao_Story" = "分享平台[KaKao]不支持Story客户端分享"; "ShareSDKConnector_Error_AliPay_NOLib" = "请将libAPOpenSdk.a导入项目并引入APOpenAPI"; "ShareSDKConnector_Error_AliPay_NOShare" = "分享平台[支付宝]客户端不支持分享功能"; "ShareSDKConnector_Error_AliPay_NOClient" = "分享平台[支付宝]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_AliPay_NOLibShare" = "分享平台[支付宝]尚未导入libAPOpenSdk.a库! 无法进行相关操作"; "ShareSDKConnector_Error_Line_NOLib" = "请将LineSDK.framework导入项目"; "ShareSDKConnector_Error_Line_NOLibShare" = "分享平台[Line]尚未导入LineSDK.framework! 无法进行相关操作"; "ShareSDKConnector_Error_Instagram_PhotoLibrary" = "尚未授权访问相册,无法进行分享"; "ShareSDKConnector_Error_Mail" = "该设备不支持发送邮件"; "ShareSDKConnector_Error_RenRen_NOLib" = "请将RennSDK.framework导入项目中"; "ShareSDKConnector_Error_RenRen_NOLibShare" = "分享平台[人人网]尚未导入RennSDK.framework库! 无法进行相关操作"; "ShareSDKConnector_Error_RenRen_Auth" = "分享平台[人人网]授权调用失败"; "ShareSDKConnector_Error_QQ_NOLib" = "请将TencentOpenAPI.framework导入项目中"; "ShareSDKConnector_Error_QQ_NOLibShare" = "分享平台[QQ]尚未导入TencentOpenApi.framework! 无法进行相关操作"; "ShareSDKConnector_Error_QQ_NOClient" = "分享平台[QQ]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_QQ_Share" = "分享平台[QQ]分享失败"; "ShareSDKConnector_Error_QQ_Version" = "当前QQ版本太低,需要更新至新版本才可以支持"; "ShareSDKConnector_Error_QQ_QZone" = "分享平台[QQ]调用分享失败!当前QQSDK不支持QZONE文字分享"; "ShareSDKConnector_Error_QQ_ShareScene" = "无法识别的分享场景"; "ShareSDKConnector_Error_QQ_Auth" = "分享平台[QQ]授权调用失败"; "ShareSDKConnector_Error_QQ_ShareType" = "不支持此分享类型"; "ShareSDKConnector_Error_Weibo_NOLibShare" = "分享平台[微博]尚未导入libWeiboSDK.a库! 无法进行相关操作"; "ShareSDKConnector_Error_Weibo_Auth" = "分享平台[微博]授权调用失败"; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/Base.lproj/country.plist ================================================ A Angola+244 Afghanistan+93 Albania+355 Algeria+213 Andorra+376 Aruba+297 Anguilla+1264 Antigua and Barbuda+1268 Argentina+54 Armenia+374 Australia+61 Austria+43 Azerbaijan+994 B Bahamas+1242 Bahrain+973 Bosnia and Herzegovina+387 Barbados+1246 Bhutan+975 Belarus+375 Belgium+32 Belize+501 Benin+229 Bermuda Is.+1441 Bolivia+591 Botswana+267 Brazil+55 Brunei+673 Bulgaria+359 Burkina-faso+226 Burundi+257 Burma+95 Bangladesh+880 C Czech Republic+420 Canada+1 Cape Verde+238 Comoros+269 Cuba+53 Costa Rica+506 Colombia+57 Cayman Is+1345 Croatia+385 Cook Is+682 Cameroon+237 Cyprus+357 Central African Republic+236 Chad+235 Chile+56 China+86 D Djibouti+253 Denmark+45 Dominica+1767 Democratic Republic of the Congo+243 Dominican Republic+1809 Djibouti+253 E Estonia+372 East Timor+670 Egypt+20 Equatorial Guinea+240 England+44 Ecuador+593 F Fiji+679 Finland+358 Faroe Islands+298 France+33 French Guiana+594 French Polynesia+689 G Germany+49 Gambia+220 Georgia+995 Grenada+1473 Greenland+299 Guadeloupe+590 Guam+1671 Guyana+592 Gabon+241 Ghana+233 Guinea+224 Guinea-Bissau+245 Guatemala+502 Greece+30 Gibraltar+350 H Haiti+509 Honduras+504 Hongkong+852 Hungary+36 I Iceland+354 Ireland+353 Ivory Coast+225 India+91 Indonesia+62 Iran+98 Iraq+964 Israel+972 Italy+39 J Japan+81 Jamaica+1876 Jordan+962 K Kampuchea+855 Kyrgyzstan+996 Korea+82 Kazakstan+7 Kiribati+686 Kenya+254 Kuwait+965 L Laos+856 Latvia+371 Lebanon+961 Lesotho+266 Liberia+231 Libya+218 Liechtenstein+423 Lithuania+370 Luxembourg+352 M Macao+853 Madagascar+261 Malawi+265 Malaysia+60 Maldives+960 Macedonia+389 Mayotte+269 Micronesia+691 Mauritania+222 Mali+223 Malta+356 Martinique+596 Mauritius+230 Mexico+52 Moldova+373 Monaco+377 Mongolia+976 Montenegro+382 Montserrat Is+1664 Morocco+212 Mozambique+258 N Netherlands+31 Netheriands Antilles+599 Namibia+264 Nepal+977 Nicaragua+505 Niger+227 Nigeria+234 Norway+47 New Zealand+64 New Caledonia+687 O Oman+968 P Philippines+63 Puerto Rico+1787 Poland+48 Paraguay+595 Papua New Cuinea+675 Panama+507 Pakistan+92 Palestinian Territory+970 Palau+680 Portugal+351 Peru+51 Q Qatar+974 R Russia+7 Réunion Island+262 Republic Of The Congo+242 Rwanda+250 Romania+40 S Sweden+46 Switzerland+41 South Africa+27 Salvador+503 Saint Lucia+1758 Saint Vincent and The Grenadines+1784 Sao Tome and Principe+239 Saint Kitts and Nevis+1869 Serbia+381 South Sudan+211 Saudi Arabia+966 Senegal+221 Seychelles+248 Sierra Leone+232 Slovakia+421 Slovenia+386 Solomon Is+677 Somali+252 Sri Lanka+94 Sudan+249 Suriname+597 Swaziland+268 Samoa+685 Singapore+65 Spain+34 Syria+963 T Togo+228 Taiwan+886 Tajikstan+992 Tanzania+255 Thailand+66 Tonga+676 Trinidad and Tobago+1868 Turks and Caicos Islands+1649 Tunisia+216 Turkey+90 Turkmenistan+993 U United Arab Emirates+971 United States of America+1 Uganda+256 Ukraine+380 Uruguay+598 Uzbekistan+998 United Kingdom+44 V Venezuela+58 Vietnam+84 Vanuatu+678 Virgin Islands, British+1340 Virgin Islands, US+1284 Y Yemen+967 Z Zimbabwe+263 Zambia+260 ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/ScriptCore/NativeExt.js ================================================ var $pluginID = "com.mob.ext";eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('6 1j=0;$1.2=5(){};$1.2.P={};$1.2.7=5(3){6 k=(4U 4T).4S()+1j;1j++;$1.2.P[k]=5(U){4R(3!==v){3(U)}4Q $1.2.P[k];$1.2.P[k]=v};4P"$1.2.P["+k+"]"};$1.2.2k=5(k,2j,2i,3){6 4=$1.2.7(3);$1.8.2k(k,2j,2i,4)};$1.2.1i=5(9,D,C,B,3){6 4=$1.2.7(3);$1.8.1i(9,D,C,B,v,v,v,4)};$1.2.4O=5(9,D,C,B,19,M,18,3){6 4=$1.2.7(3);$1.8.1i(9,D,C,B,19,M,18,4)};$1.2.2h=5(t,2g,1b,1a,3){6 4=$1.2.7(3);$1.8.2h(t,2g,1b,1a,4)};$1.2.2f=5(t,1b,1a,3){6 4=$1.2.7(3);$1.8.2f(t,1b,1a,4)};$1.2.2e=5(3){6 4=$1.2.7(3);$1.8.2e(4)};$1.2.2d=5(9,3){6 4=$1.2.7(3);$1.8.2d(9,4)};$1.2.2c=5(3){6 4=$1.2.7(3);$1.8.2c(4)};$1.2.2b=5(3){6 4=$1.2.7(3);$1.8.2b(4)};$1.2.2a=5(29,3){6 4=$1.2.7(3);$1.8.2a(29,4)};$1.2.28=5(9,3){6 4=$1.2.7(3);$1.8.28(9,4)};$1.2.27=5(26,3){6 4=$1.2.7(3);$1.8.27(26,4)};$1.2.1h=5(q,t,9,D,C,B,3){6 4=$1.2.7(3);$1.8.1h(q,t,9,D,C,B,v,v,v,4)};$1.2.25=5(24,M,R,23,k,22,21,3){6 4=$1.2.7(3);$1.8.25(24,M,R,23,k,22,21,4)};$1.2.4N=5(q,t,9,D,C,B,19,M,18,3){6 4=$1.2.7(3);$1.8.1h(q,t,9,D,C,B,19,M,18,4)};$1.2.4M=5(a,k,z,3){6 4=$1.2.7(3);$1.8.4L(a,k,z,4)};$1.2.4K=5(a,k,9,3){6 4=$1.2.7(3);$1.8.4J(a,k,9,4)};$1.2.4I=5(a,9,3){6 4=$1.2.7(3);$1.8.4H(a,9,4)};$1.2.4G=5(a,f,h,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.p,4,h)};$1.2.4F=5(a,f,b,g,i,j,20,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.n,4,b,g,i,j,20)};$1.2.4E=5(a,f,b,g,i,9,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.o,4,b,g,i,9)};$1.2.4D=5(a,f,b,g,i,9,X,W,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.1d,4,b,g,i,9,X,W)};$1.2.4C=5(a,f,b,g,i,9,V,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.N,4,b,g,i,9,V)};$1.2.4B=5(a,f,b,g,i,9,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.H,4,b,g,i,9)};$1.2.4A=5(a,f,b,g,i,1Z,1Y,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.4z,4,b,g,i,1Z,1Y)};$1.2.4y=5(a,f,b,g,i,1X,1W,1V,3){6 4=$1.2.7(3);$1.8.A(a,f,$1.e.d.4x,4,b,g,i,1X,1W,1V)};$1.2.4w=5(c,9,3){6 4=$1.2.7(3);$1.8.4v(c,9,4)};$1.2.4u=5(c,3){6 4=$1.2.7(3);$1.8.4t(c,4)};$1.2.4s=5(c,h,u,3){6 4=$1.2.7(3);$1.8.1g(c,$1.e.d.p,4,h,u)};$1.2.4r=5(c,h,j,u,3){6 4=$1.2.7(3);$1.8.1g(c,$1.e.d.n,4,h,j,u)};$1.2.4q=5(c,b,g,i,9,1U,u,3){6 4=$1.2.7(3);$1.8.1g(c,$1.e.d.o,4,b,g,i,9,1U,u)};$1.2.4p=5(c,17,u,h,3){6 4=$1.2.7(3);$1.8.1T(c,$1.e.d.p,4,17,u,h)};$1.2.4o=5(c,17,u,h,j,3){6 4=$1.2.7(3);$1.8.1T(c,$1.e.d.n,4,17,u,h,j)};$1.2.4n=5(a,z,m,3){6 4=$1.2.7(3);$1.8.4m(a,z,4,m)};$1.2.4l=5(a,9,3){6 4=$1.2.7(3);$1.8.4k(a,9,4)};$1.2.4j=5(a,f,h,m,3){6 4=$1.2.7(3);$1.8.O(a,f,$1.e.d.p,4,h,m)};$1.2.4i=5(a,f,b,g,i,j,m,3){6 4=$1.2.7(3);$1.8.O(a,f,$1.e.d.n,4,b,g,i,j,m)};$1.2.4h=5(a,f,b,g,i,9,m,3){6 4=$1.2.7(3);$1.8.O(a,f,$1.e.d.o,4,b,g,i,9,m)};$1.2.4g=5(a,f,b,g,i,9,1S,m,3){6 4=$1.2.7(3);$1.8.O(a,f,$1.e.d.N,4,b,g,i,9,1S,m)};$1.2.4f=5(a,f,b,g,i,9,1R,m,3){6 4=$1.2.7(3);$1.8.O(a,f,$1.e.d.H,4,b,g,i,9,1R,m)};$1.2.4e=5(a,9,3){6 4=$1.2.7(3);$1.8.4d(a,9,4)};$1.2.4c=5(c,16,w,3){6 4=$1.2.7(3);$1.8.4b(c,16,w,4)};$1.2.4a=5(c,16,w,9,3){6 4=$1.2.7(3);$1.8.49(c,16,w,9,4)};$1.2.48=5(c,w,Z,3){6 4=$1.2.7(3);$1.8.47(c,w,Z,4)};$1.2.46=5(c,9,3){6 4=$1.2.7(3);$1.8.45(c,9,4)};$1.2.1Q=5(1P,14,1O,3){6 4=$1.2.7(3);$1.8.1Q(1P,14,1O,4)};$1.2.44=5(l,h,b,1N,15,3){6 4=$1.2.7(3);$1.8.43(l,4,h,b,1N,15)};$1.2.42=5(l,h,b,1M,15,1L,1K,3){6 4=$1.2.7(3);$1.8.41(l,4,h,b,1M,15,1L,1K)};$1.2.40=5(l,h,s,14,3){6 4=$1.2.7(3);$1.8.3Z(l,4,h,s,14)};$1.2.3Y=5(a,c,13,z,3){6 4=$1.2.7(3);$1.8.3X(a,c,13,z,4)};$1.2.3W=5(a,c,13,9,3){6 4=$1.2.7(3);$1.8.3V(a,c,13,9,4)};$1.2.3U=5(h,3){6 4=$1.2.7(3);$1.8.1J($1.e.d.p,4,h)};$1.2.3T=5(h,9,3){6 4=$1.2.7(3);$1.8.1J($1.e.d.o,4,h,9)};$1.2.3S=5(a,z,3){6 4=$1.2.7(3);$1.8.3R(a,z,4)};$1.2.3Q=5(a,1I,1H,g,9,j,t,1G,3){6 4=$1.2.7(3);$1.8.3P(a,1I,4,$1.e.d.o,1H,g,9,j,t,1G)};$1.2.3O=5(c,L,9,b,g,r,3){6 4=$1.2.7(3);$1.8.1f($1.e.d.o,4,c,L,9,b,g,r)};$1.2.3N=5(c,L,s,3){6 4=$1.2.7(3);$1.8.1f($1.e.d.n,4,c,L,s)};$1.2.3M=5(c,L,K,1F,k,1E,3){6 4=$1.2.7(3);$1.8.1f($1.e.d.H,4,c,L,K,1F,k,1E)};$1.2.3L=5(a,9,3){6 4=$1.2.7(3);$1.8.3K(a,9,4)};$1.2.3J=5(l,j,x,y,3){6 4=$1.2.7(3);$1.8.3I(l,4,j,x,y)};$1.2.3H=5(h,3){6 4=$1.2.7(3);$1.8.12($1.e.d.p,4,h)};$1.2.3G=5(j,x,y,3){6 4=$1.2.7(3);$1.8.12($1.e.d.n,4,j,x,y)};$1.2.3F=5(11,x,y,3){6 4=$1.2.7(3);$1.8.12($1.e.d.N,4,11,x,y)};$1.2.3E=5(K,x,y,3){6 4=$1.2.7(3);$1.8.12($1.e.d.H,4,K,x,y)};$1.2.3D=5(c,F,3){6 4=$1.2.7(3);$1.8.E($1.e.d.3C,4,F,c)};$1.2.3B=5(s,3){6 4=$1.2.7(3);$1.8.E($1.e.d.n,4,s)};$1.2.3A=5(c,s,3){6 4=$1.2.7(3);$1.8.E($1.e.d.3z,4,s,c)};$1.2.3y=5(c,9,b,g,r,3){6 4=$1.2.7(3);$1.8.E($1.e.d.o,4,c,9,b,g,r)};$1.2.3x=5(1D,3){6 4=$1.2.7(3);$1.8.E($1.e.d.n,4,v,1D)};$1.2.3w=5(11,3){6 4=$1.2.7(3);$1.8.E($1.e.d.N,4,11)};$1.2.3v=5(K,3){6 4=$1.2.7(3);$1.8.E($1.e.d.H,4,K)};$1.2.3u=5(a,9,3){6 4=$1.2.7(3);$1.8.3t(a,9,4)};$1.2.3s=5(h,3){6 4=$1.2.7(3);$1.8.1C($1.e.d.p,4,h)};$1.2.3r=5(j,3){6 4=$1.2.7(3);$1.8.1C($1.e.d.n,4,j)};$1.2.3q=5(9,3){6 4=$1.2.7(3);$1.8.3p(9,4)};$1.2.3o=5(1B,10,3){6 4=$1.2.7(3);$1.8.3n(1B,10,4)};$1.2.3m=5(1A,10,h,s,b,1z,1y,3){6 4=$1.2.7(3);$1.8.3l(1A,10,h,s,b,1z,1y,4)};$1.2.3k=5(a,f,h,3){6 4=$1.2.7(3);$1.8.1e(a,f,$1.e.d.p,4,h)};$1.2.3j=5(a,f,b,g,j,3){6 4=$1.2.7(3);$1.8.1e(a,f,$1.e.d.n,4,b,g,j)};$1.2.3i=5(a,f,b,g,j,9,3){6 4=$1.2.7(3);$1.8.1e(a,f,$1.e.d.o,4,b,g,j,9)};$1.2.3h=5(a,9,3){6 4=$1.2.7(3);$1.8.3g(a,9,4)};$1.2.3f=5(c,w,Z,1x,3){6 4=$1.2.7(3);$1.8.3e(c,w,Z,1x,4)};$1.2.3d=5(1w,3){6 4=$1.2.7(3);$1.8.3c(1w,4)};$1.2.3b=5(c,9,3){6 4=$1.2.7(3);$1.8.3a(c,9,4)};$1.2.39=5(c,f,h,3){6 4=$1.2.7(3);$1.8.Y(c,f,$1.e.d.p,4,h)};$1.2.38=5(c,f,h,r,J,I,3){6 4=$1.2.7(3);$1.8.Y(c,f,$1.e.d.n,4,h,r,J,I)};$1.2.37=5(c,f,h,r,J,I,b,9,3){6 4=$1.2.7(3);$1.8.Y(c,f,$1.e.d.o,4,h,r,J,I,b,9)};$1.2.36=5(c,f,h,r,J,I,b,9,1v,1u,1t,1s,3){6 4=$1.2.7(3);$1.8.Y(c,f,$1.e.d.1d,4,h,r,J,I,b,9,1v,1u,1t,1s)};$1.2.35=5(a,3){6 4=$1.2.7(3);$1.8.34(a,4)};$1.2.33=5(a,k,9,3){6 4=$1.2.7(3);$1.8.32(a,k,9,4)};$1.2.31=5(a,9,3){6 4=$1.2.7(3);$1.8.30(a,9,4)};$1.2.2Z=5(a,f,h,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.p,4,h)};$1.2.2Y=5(a,f,b,g,i,j,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.n,4,b,g,i,j)};$1.2.2X=5(a,f,b,g,i,9,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.o,4,b,g,i,9)};$1.2.2W=5(a,f,b,g,i,9,X,W,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.1d,4,b,g,i,9,X,W)};$1.2.2V=5(a,f,b,g,i,9,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.H,4,b,g,i,9)};$1.2.2U=5(a,f,b,g,i,9,V,3){6 4=$1.2.7(3);$1.8.G(a,f,$1.e.d.N,4,b,g,i,9,V)};$1.2.2T=5(l,h,j,1r,1q,3){6 4=$1.2.7(3);$1.8.2S(l,4,h,j,1r,1q)};$1.2.2R=5(a,h,3){6 4=$1.2.7(3);$1.8.1c(a,$1.e.d.p,4,h)};$1.2.2Q=5(a,b,g,j,3){6 4=$1.2.7(3);$1.8.1c(a,$1.e.d.n,4,b,g,j)};$1.2.2P=5(a,b,g,j,9,3){6 4=$1.2.7(3);$1.8.1c(a,$1.e.d.o,4,b,g,j,9)};$1.2.2O=5(a,9,3){6 4=$1.2.7(3);$1.8.2N(a,9,4)};$1.2.2M=5(a,k,9,q,3){6 4=$1.2.7(3);$1.8.2L(a,k,9,q,4)};$1.2.2K=5(q,a,U,k,3){6 4=$1.2.7(3);$1.8.2J(q,a,U,k,4)};$1.2.2I=5(T,1p,q,3){6 4=$1.2.7(3);$1.8.2H(T,1p,q,4)};$1.2.2G=5(T,3){6 4=$1.2.7(3);$1.8.2F(T,4)};$1.2.2E=5(1o,3){6 4=$1.2.7(3);$1.8.2D(1o,4)};$1.2.2C=5(3){6 4=$1.2.7(3);$1.8.2B(4)};$1.2.2A=5(c,S,l,3){6 4=$1.2.7(3);$1.8.2z(c,4,l,S)};$1.2.2y=5(c,9,3){6 4=$1.2.7(3);$1.8.2x(c,9,4)};$1.2.2w=5(S,3){6 4=$1.2.7(3);$1.8.2v(S,4)};$1.2.2u=5(F,3){6 4=$1.2.7(3);$1.8.2t(F,4)};$1.2.2s=5(k,F,1n,1m,1l,3){6 4=$1.2.7(3);$1.8.2r(k,4,F,1n,1m,1l)};$1.2.2q=5(k,1k,R,3){6 4=$1.2.7(3);$1.8.2p(k,4,1k,R)};$1.2.2o=5(l,Q,3){6 4=$1.2.7(3);$1.8.2n(l,Q,4)};$1.2.2m=5(l,Q,m,3){6 4=$1.2.7(3);$1.8.2l(l,Q,4,m)};',62,305,'|mob|ext|callback|func|function|var|_bindCallbackFunc|native|url|appId|title|appKey|contentType|shareSDK|scene|desc|text|thumbImage|image|sessionId|type|QQShareType|Image|WebPage|Text|platformType|imageUrl|images|name|access_token|null|redirectUri|||scopes|ssdk_plugin_wechat_share|header|params|method|ssdk_plugin_facebookmessenger_share|videoURL|ssdk_plugin_yixin_share|Video|imageHeight|imageWidth|video|appName|consumerSecret|Audio|ssdk_plugin_qq_share|_callbackFuncs|parameter|token|assetURL|imagePath|data|musicUrl|fileData|extInfo|ssdk_plugin_kakao_share|scope|oauthToken|audio|ssdk_plugin_whatsapp_share|secretKey|urls|recipients|appSecret|aid|oauthTokenSecret|oauthParams|domain|secure|ssdk_plugin_dingtalk_share|App|ssdk_plugin_alipay_share|ssdk_plugin_facebook_share|ssdk_plugin_weibo_share|ssdk_callHTTPApi|http|_seqId|fileURL|authorization|parts|jsonString|className|thumbImagePath|menuDisplayY|menuDisplayX|ipadExecParams|iphoneExecParams|andoridExecParams|appButtonTitle|authType|clientType|tags|notebook|requestUrl|baseUrl|ssdk_plugin_line_share|gif|accessToken|uid|source|caption|redirectUrl|ssdk_plugin_googleplus_share|bcc|cc|attachments|attachements|user|platform|ssdk_getShortUrls|videoFlashUrl|audioFlashUrl|ssdk_plugin_weibo_nosdk_share|objectId|webpageURL|path|userName|sourceFileData|fileExtension|emoticonData|tag|mediaURL|tokenSecret|consumerKey|ssdk_plugin_twitter_uploadVideo|xmlString|parseXML|downloadFile|pluginKey|isPluginRegisted|isPad|isMultitaskingSupported|canOpenURL|getAppConfig|getCacheData|value|setCacheData|userData|pluginId|ssdk_auth|ssdk_plugin_QQExtensionShare|ssdk_QQExtensionShare|ssdk_plugin_wechatExtensionShare|ssdk_wechatExtensionShare|ssdk_plugin_uploadDropboxFile|ssdk_upLoadDropboxFile|ssdk_plugin_uploadYouTubeVideo|ssdk_upLoadYouTubeVideo|ssdk_plugin_getVideoSize|ssdk_getVideoSize|ssdk_plugin_getAssetType|ssdk_getAssetType|ssdk_plugin_MeiPai_handleShareCallback|ssdk_meipaiHandleShareCalback|ssdk_plugin_meipai_share|ssdk_meipaiShare|ssdk_plugin_deviceModel|ssdk_getDeviceModel|ssdk_plugin_isConnectedPlatformSDK|ssdk_isConnectedPlatformSDK|ssdk_plugin_checkThumbImageSize|checkThumbImageSize|ssdk_plugin_getImageData|ssdk_getImageData|ssdk_plugin_setDataToPasteboard|ssdk_setDataToPasteboard|ssdk_plugin_getDataFromPasteboard|ssdk_getDataFromPasteboard|ssdk_plugin_dingtalk_handleShareCallback|ssdk_dingtalkHandleShareCallback|ssdk_dingtalkShareWebpage|ssdk_dingtalkShareImage|ssdk_dingtalkShareText|ssdk_plugin_print_share|ssdk_printShare|ssdk_yixinShareAudio|ssdk_yixinShareVideo|ssdk_yixinShareApp|ssdk_yixinShareWebpage|ssdk_yixinShareImage|ssdk_yixinShareText|ssdk_plugin_yixin_handleShareCallback|ssdk_yixinHandleShareCalback|ssdk_plugin_yixin_handleSSOCallback|ssdk_yixinHandleSSOCallback|ssdk_plugin_yixin_auth|ssdk_yixinAuth|ssdk_kakaoShareApp|ssdk_kakaoShareWebpage|ssdk_kakaoShareImage|ssdk_kakaoShareText|ssdk_plugin_kakao_handleSSOCallback|ssdk_kakaoHandleSSOCallback|ssdk_plugin_line_auth|ssdk_lineAuth|ssdk_plugin_kakao_auth|ssdk_kakaoAuth|ssdk_plugin_alipay_handleShareCallback|ssdk_alipayHandleShareCallback|ssdk_alipayShareWebpage|ssdk_alipayShareImage|ssdk_alipayShareText|ssdk_plugin_evernote_share|ssdk_evernoteShare|ssdk_plugin_evernote_getuserinfo|ssdk_evernoteGetUserInfo|ssdk_plugin_line_handleSSOCallback|ssdk_lineHandleSSOCalback|ssdk_lineShareImage|ssdk_lineShareText|ssdk_plugin_facebookmessage_handleShareCallback|ssdk_facebookMessengerHandleShareCalback|ssdk_facebookmessengerShareVideo|ssdk_facebookmessengerShareAudio|ssdk_facebookmessengerShareGif|ssdk_facebookmessengerShareWebPage|FBMessageImages|ssdk_facebookmessengerShareImages|ssdk_facebookmessengerShareImage|FBMessageVideo|ssdk_facebookmessengerShareAssetVideo|ssdk_whatsappShareVideo|ssdk_whatsappShareAudio|ssdk_whatsappShareImage|ssdk_whatsappShareText|ssdk_plugin_instagram_share|ssdk_instagramShare|ssdk_plugin_facebook_handleShareCallback|ssdk_facebookHandleShareCalback|ssdk_facebookShareVideo|ssdk_facebookShareImage|ssdk_facebookClientShareWebPage|ssdk_plugin_facebook_web_share|ssdk_facebookShareWebPage|ssdk_plugin_facebook_auth|ssdk_faceBookAuth|ssdk_googleplusShareWebPage|ssdk_googleplusShareText|ssdk_plugin_renren_handleSSOCallback|ssdk_renrenHandleSSOCallback|ssdk_plugin_renren_auth|ssdk_renrenAuth|ssdk_plugin_copy|ssdk_copy|ssdk_plugin_mail_share|ssdk_mailShare|ssdk_plugin_sms_share|ssdk_smsShare|ssdk_plugin_weibo_handleSSOCallback|ssdk_weiboHandleSSOCallback|ssdk_plugin_weibo_auth|ssdk_weiboAuth|ssdk_plugin_tcweibo_handleSSOCallback|ssdk_tcweiboHandleSSOCallback|ssdk_plugin_tcweibo_auth|ssdk_tcweiboAuth|ssdk_plugin_qq_handleShareCallback|ssdk_qqHandlerShareCallback|ssdk_qqShareVideo|ssdk_qqShareAudio|ssdk_qqShareWebpage|ssdk_qqShareImage|ssdk_qqShareText|ssdk_plugin_qq_handleSSOCallback|ssdk_qqHandlerSSOCallback|ssdk_plugin_qq_auth|ssdk_qqAuth|ssdk_weiboShareImageNoSDK|ssdk_weiboShareTextNoSDK|ssdk_weiboShareWebpage|ssdk_weiboShareImage|ssdk_weiboShareText|ssdk_plugin_weibo_getAid|sdk_getWeiboAid|ssdk_plugin_weibo_handleShareCallback|ssdk_weiboHandleShareCallback|MiniProgram|ssdk_wechatShareMiniProgram|File|ssdk_wechatShareFile|ssdk_wechatShareVideo|ssdk_wechatShareAudio|ssdk_wechatShareApp|ssdk_wechatShareWebpage|ssdk_wechatShareImage|ssdk_wechatShareText|ssdk_plugin_wechat_handleShareCallback|ssdk_wechatHandleShareCalback|ssdk_plugin_wechat_handleSSOCallback|ssdk_wechatHandleSSOCalback|ssdk_plugin_wechat_auth|ssdk_wechatAuth|ssdk_callOAuthApi|oauth|return|delete|if|getTime|Date|new'.split('|'),0,{})) ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/ScriptCore/ShareSDK.js ================================================ var $pluginID = "com.mob.sharesdk.base";eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('d 1f=f;d 13={};d N={};d l={F:{},E:{},D:{}};d 1r="4M-4L";h 1e(1d){X.2o=1d;X.1z={2n:"4K",4J:2p,2m:2p};X.4I={}}1e.1A.1d=h(){m X.2o};1e.1A.1x=h(){m X.1z["2n"]};1e.1A.1w=h(){m X.1z["2m"]};h 4H(){}h c(){}c.u={1y:0,4G:1,4F:2,4E:5,4D:6,4C:7,4B:8,4A:10,4z:11,4y:12,4x:14,4w:15,4v:16,4u:17,4t:18,2l:19,4s:20,4r:21,4q:22,4p:23,4o:24,4n:25,4m:26,4l:27,4k:30,4j:34,4i:35,4h:36,4g:37,4f:38,4e:39,4d:40,4c:41,4b:42,4a:43,49:44,48:45,47:46,3Z:3Y,3X:3W,3V:3U,3T:3S,3R:3Q,3P:3O,3N:3M,3L:3K,3J:3I,3H:3G};c.J={3F:0,3E:1,I:2,3D:3,3C:4};c.L={1y:0,K:3B,3A:3z,3y:3x,3w:3v,3u:3t,3s:3r,3q:3p,3o:3n,3m:3l};c.3k={1y:0,3j:1,3i:2,2l:3};c.3h={3g:0,3f:1,3e:2,3d:3,3c:4,3b:5,3a:6,33:7,32:8,31:9,2Z:10};c.2Y={2X:0,2W:1,2V:2};c.2U=h(b,2k){13[b]=2k};c.t=h(b){d a=N[b];d B;e(a==f){d y=13[b];e(y!=f){a=1c y(b);N[b]=a;B={};e(l["F"][b]){B=l["F"][b]}e(l["E"][b]){B=l["E"][b]}e(l["D"][b]){B=l["D"][b]}a.V(B);a.U()}}x{B={};e(l["F"][b]){B=l["F"][b]}e(l["E"][b]){B=l["E"][b]}e(l["D"][b]){B=l["D"][b]}a.V(B);a.U()}m a};c.1x=h(){m 1f.1x()};c.1w=h(){m 1f.1w()};c.2T=h(b,Z,z,Y){e(z!=f&&z.T>0){d 1u=/(2S?:\\/\\/){1}[A-2R-2Q-2P\\.\\-\\/:\\?&%=,;\\[\\]\\{\\}`~!@#\\$\\^\\*\\(\\)\\+\\\\|]+/g;d 2j=/<2O[^>]*>/g;d 2i=/(\\w+)\\s*=\\s*["|\']([^"\']*)["|\']/g;d 1g={};d 1v={};1b(d i=0;i0){$p.2H.2G(b,1l,Z,h(r){e(r.M==f){1b(d i=0;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('a 2l="76://75";a V={24:"74",23:"73",3I:"72",3K:"71",3J:"70",4j:"6Z"};a 1n={};k t(r){e.5l=r;e.1b={};e.22=7;e.6Y=7;e.1N=7;e.1T=7;e.J=$6.b.6X()}t.u.r=k(){H e.5l};t.u.6W=k(o,f){$6.D.19(o,$6.b.s.1I,7)};t.u.A=k(){H"t"};t.u.P=k(){9(e.1b[V.24]!==2C){H e.1b[V.24]}H 7};t.u.2m=k(){9(e.1b[V.23]!==2C){H e.1b[V.23]}H 7};t.u.O=k(){9(e.1b[V.3K]!==2C){H e.1b[V.3K]}H $6.b.O()};t.u.3h=k(){H"5k-1f-"+$6.b.1R.t+"-"+e.P()};t.u.3n=k(){9(e.1b[V.3J]!==2C){H e.1b[V.3J]}H $6.b.3n()};t.u.2W=k(){9(e.1b[V.3I]!==2C){H e.1b[V.3I]}H 7};t.u.6V=k(2h){9(6U.1K===0){H e.1b}l{e.1b=e.4i(2h);e.22=e.4k(2h);e.4l()}};t.u.6T=k(){a d=e;a 1O="5k-1f";$6.N.40("5j",1q,1O,k(f){9(f!=7){a 2B=f.2h;9(2B==7){2B={}}2B["6S"+d.r()]=d.P();$6.N.41("5j",2B,1q,1O,7)}})};t.u.6R=k(){H 1U};t.u.2M=k(o,Q){a p=7;a c;9(e.4m()){9(Q==7){Q={}}9(Q["1A"]==7){Q["1A"]=["6Q","6P","6O","6N","3D","6M","6L","6K","6J","6I","6H","6G","6F","6E"]}a d=e;a O=e.O();9(O==="2O"||O==="6D"){$6.N.6C(k(f){9(f.12){d.37(k(1p,1J){9(1p){d.4g(o,1J,Q)}l 9(O==="2O"){d.2k(o,Q)}l{a c=7;9(d.J==="L-K"){c="分享平台["+d.A()+"]不支持["+O+"]授权方式!"}l{c="1f ["+d.A()+"]31 1k 30 3H r :["+O+"]!"}a p={y:$6.b.E.2Z,c:c};$6.D.19(o,$6.b.s.C,p)}})}l 9(O==="2O"){d.2k(o,Q)}l{c=7;9(d.J==="L-K"){c="分享平台["+d.A()+"]不支持["+O+"]授权方式!"}l{c="1f ["+d.A()+"]31 1k 30 3H r :["+O+"]!"}p={y:$6.b.E.2Z,c:c};$6.D.19(o,$6.b.s.C,p)}})}l 9(O==="6B"){d.2k(o,Q)}l{c=7;9(e.J==="L-K"){c="分享平台["+d.A()+"]不支持["+O+"]授权方式!"}l{c="1f ["+d.A()+"]31 1k 30 3H r :["+O+"]!"}p={y:$6.b.E.2Z,c:c};$6.D.19(o,$6.b.s.C,p)}}l{c=7;9(e.J==="L-K"){c="分享平台["+e.A()+"]应用信息无效!"}l{c="1f["+e.A()+"]5h 6A!"}p={y:$6.b.E.6z,c:c};$6.D.19(o,$6.b.s.C,p)}};t.u.59=k(o,Z){a p=7;a d=e;a c;a 1Q=$6.10.5f(Z);9(1Q!=7){a 1i=1Q.6y;9(1i==7){1i=1Q.1i}a F=$6.10.5e(1i);9(F!=7){9(F.y!=7){c=7;9(e.J==="L-K"){c="平台["+e.A()+"]授权失败!"}l{c="1f ["+d.A()+"] 2M 6x 6w!"}p={y:$6.b.E.T,c:c,16:F};$6.D.19(o,$6.b.s.C,p)}l{a 5i={2K:F["2K"],3E:"17"};$6.N.58($6.b.1R.t,7,"1u://1D.14.15/1C.8/2w","2v",5i,7,k(f){9(f!=7){9(f["y"]!=7){$6.D.19(o,$6.b.s.C,f)}l 9(f["3G"]!=7&&f["3G"]===52){a 1E=$6.10.55($6.10.54(f["53"]));9(1E.p==7){F["18"]=1E.17;d.44(o,F)}l{p={y:$6.b.E.T,16:1E};$6.D.19(o,$6.b.s.C,p)}}l{p={y:$6.b.E.T,16:f};$6.D.19(o,$6.b.s.C,p)}}l{p={y:$6.b.E.T};$6.D.19(o,$6.b.s.C,p)}})}}l{c=7;9(e.J==="L-K"){c="无效的授权回调:["+Z+"]"}l{c="2U h z:["+Z+"]"}p={y:$6.b.E.5g,c:c};$6.D.19(o,$6.b.s.C,p)}}l{c=7;9(e.J==="L-K"){c="无效的授权回调:["+Z+"]"}l{c="5h h z:["+Z+"]"}p={y:$6.b.E.5g,c:c};$6.D.19(o,$6.b.s.C,p)}};t.u.6v=k(o,Z,18){a p=7;a c;a 1Q=$6.10.5f(Z);9(1Q!=7){a F=$6.10.5e(1Q.1i);9(F["6u"]!=7){$6.D.2A(o,$6.b.s.1I,7)}l 9(F["y"]!=7){9(F["y"]===6t){$6.D.2A(o,$6.b.s.1I,7)}l{c=7;9(e.J==="L-K"){c="添加好友失败!"}l{c="5d 5c 5b 5a!"}p={y:$6.b.E.T,c:c,16:F};$6.D.2A(o,$6.b.s.C,p)}}l{a 1i={18:18};e.3i(1i,k(G,f){a q=7;9(G===$6.b.s.13){q=f}$6.D.2A(o,$6.b.s.13,q)})}}l{c=7;9(e.J==="L-K"){c="添加好友失败,无效的回调:["+Z+"]"}l{c="5d 5c 5b 5a.2U h :["+Z+"]"}p={y:$6.b.E.T,c:c};$6.D.2A(o,$6.b.s.C,p)}};t.u.6s=k(o,Z,49,48){9(Z.2N(e.1T+"://")===0){e.59(o,Z);H 1U}H 1q};t.u.3i=k(1i,h){a d=e;a z=7;9(1i!=7&&1i.18!=7){z="1u://1D.14.15/1C.8/"+1i.18}l{z="1u://1D.14.15/1C.8/2w"}a F={3E:"17,A,51,50,4Z,1s,4Y,4X,3e,4W,4V,4U,4T,4S,3d,2g,4R,6r,4Q,3b,3D,4P,4O,4N,4M,6q,4L,4K,3g,4J,4I,4H,4G,4F,4E,1z"};d.1o(k(q){d.1P(z,"2v",F,7,k(G,f){a w=f;9(G===$6.b.s.13){w={2J:d.r()};d.2G(w,f);9(w["18"]===q["18"]){w["1c"]=q["1c"]}}9(h!=7){h(G,w)}})})};t.u.1P=k(z,57,F,56,h){a p=7;a d=e;e.1o(k(q){9(q!=7){9(F==7){F={}}9(q.1c!=7){F["2K"]=q.1c.2I}$6.N.58($6.b.1R.t,7,z,57,F,56,k(f){9(f!=7){9(f["y"]!=7){9(h){h($6.b.s.C,f)}}l{a 1E=$6.10.55($6.10.54(f["53"]));9(f["3G"]===52){9(h){h($6.b.s.13,1E)}}l{a 3F=$6.b.E.T;2j(1E["y"]){1a 6p:3F=$6.b.E.3B;R}p={y:3F,16:1E};9(h){h($6.b.s.C,p)}}}}l{p={y:$6.b.E.T};9(h){h($6.b.s.C,p)}}})}l{a c=7;9(e.J==="L-K"){c="尚未授权["+d.A()+"]用户"}l{c="2U 4C ["+d.A()+"]"}p={y:$6.b.E.3B,c:c};9(h){h($6.b.s.C,p)}}})};t.u.6o=k(){e.2H(7,7);$6.N.21("15.6.20.1Z.14",k(f){9(f.12){$6.D.6n()}})};t.u.6m=k(o,q,h){a c=7;9(e.J==="L-K"){c="平台["+e.A()+"]不支持添加好友方法!"}l{c="1f["+e.A()+"]31 1k 30 6l 4D"}a p={y:$6.b.E.2Z,c:c};9(h!=7){h($6.b.s.C,p)}};t.u.6k=k(2Y,2y,h){a d=e;a F={6j:2Y,6i:2y,3E:"17,A,51,50,4Z,1s,4Y,4X,3e,4W,4V,4U,4T,4S,3d,2g,4R,4Q,3b,3D,4P,4O,4N,4M,4L,4K,3g,4J,4I,4H,4G,4F,4E,1z"};d.1P("1u://1D.14.15/1C.8/2w/4D","2v",F,7,k(G,f){a w=f;9(G===$6.b.s.13){w={};w["3C"]=2Y-2y;w["6h"]=2Y+2y;9(w["3C"]<0){w["3C"]=0}a 2z=[];a 2X=f["f"];9(2X!=7){1V(a i=0;i<2X.1K;i++){a q={2J:$6.b.1R.t};d.2G(q,2X[i]);2z.1y(q)}}w["2z"]=2z;w["6g"]=2z.1K===2y}9(h!=7){h(G,w)}})};t.u.4B=k(o,x,v,h){a d=e;$6.N.21("15.6.20.1Z.14",k(f){9(f.12){a B=$6.b.M(d.r(),x,"B");9(B!=7){$6.N.6f(d.P(),d.2W(),B,k(f){9(f.y!=7){d.25(o,$6.b.W.29,x,v,h)}l{a Y={2V:d.r(),B:B};1n[o]={I:Y,16:v}}})}l{a c=7;9(e.J==="L-K"){c="分享参数1h不能为空!"}l{c="1B 2t 1h 2s 1k 2r 2q!"}a p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}}l{d.25(o,$6.b.W.29,x,v,h)}})};t.u.4A=k(o,x,v,h){a p;a c;a d=e;$6.N.21("15.6.20.1Z.14",k(f){9(f.12){a z=$6.b.M(d.r(),x,"z");9(z!=7){a 1v=$6.b.M(d.r(),x,"U");a 1d=$6.b.M(d.r(),x,"1d");a B=$6.b.M(d.r(),x,"B");a 1j="";9(B!=7&&1x.u.1G.1F(B)==="[1w 1S]"){1j=B[0]}d.2p([1v,z],k(f){1v=f.12[0];z=f.12[1];$6.N.6e(d.P(),d.2W(),z,1d,1v,1j,k(f){9(f.y!=7){d.25(o,$6.b.W.2D,x,v,h)}l{a Y={2V:d.r(),U:1v,1d:1d,z:z,B:B};1n[o]={I:Y,16:v}}})})}l{c=7;9(e.J==="L-K"){c="分享参数z不能为空!"}l{c="1B 2t z 2s 1k 2r 2q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}}l{c=7;9(d.J==="L-K"){c="平台["+d.A()+"]需要依靠1m.1g进行分享,请先导入1m.1g后再试!"}l{c="1f ["+d.A()+"] 3w 3v 1m.1g,3u 3t 1m.1g 3s 3r 3q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}})};t.u.3o=k(o,x,v,h){a d=e;a p;a c;$6.N.21("15.6.20.1Z.14",k(f){9(f.12){a X=$6.b.M(d.r(),x,"3L");9(X==7){X=$6.b.M(d.r(),x,"z")}9(X!=7){d.1o(k(q){9(q!=7&&d.43(q)){$6.N.6d(d.P(),d.2W(),X,q.18,o,q.1c.2I,k(f){9(f.y!=7){9(h!=7){h($6.b.s.C,f,7,v)}}l{a Y;9(f.6c){Y={2V:d.r(),X:X};1n[o]={I:Y,16:v};$6.D.1H(o,$6.b.s.6b,7,7,7)}l{Y={2V:d.r(),X:X};1n[o]={I:Y,16:v}}}})}l{a c=7;9(e.J==="L-K"){c="尚未授权["+d.A()+"]用户"}l{c="2U 4C ["+d.A()+"]"}p={y:$6.b.E.3B,c:c};9(h){h($6.b.s.C,p,7,v)}}})}l{c=7;9(d.J==="L-K"){c="分享参数X不能为空!"}l{c="1B 2t X 2s 1k 2r 2q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}}l{c=7;9(e.J==="L-K"){c="平台["+d.A()+"]需要依靠1m.1g进行分享,请先导入4r.1g后再试!"}l{c="1f ["+d.A()+"] 3w 3v 1m.1g,3u 3t 1m.1g 3s 3r 3q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}})};t.u.4x=k(o,r,x,v,h){a d=e;2j(r){1a $6.b.W.33:{d.3p(o,x,v,h);R}1a $6.b.W.29:{d.4B(o,x,v,h);R}1a $6.b.W.32:{d.3o(o,x,v,h);R}1a $6.b.W.2D:{d.4A(o,x,v,h);R}3j:{a c=7;9(e.J==="L-K"){c="不支持的分享类型["+r+"]"}l{c="3k 1B r ["+r+"]"}a p={y:$6.b.E.4o,c:c};9(h!=7){h($6.b.s.C,p,7,v)}R}}};t.u.1B=k(o,x,h){a d=e;a 4y=x!=7?x["@6a"]:1q;a 2T=x!=7?x["@2T"]:7;a v={"@2T":2T};a r=$6.b.M(d.r(),x,"r");9(r==7){r=$6.b.W.4z}9(r===$6.b.W.4z){r=e.3M(x,1U)}9(4y){d.37(k(1p,1J){9(1p){d.4x(o,r,x,v,h)}l{d.25(o,r,x,v,h)}})}l{d.25(o,r,x,v,h)}};t.u.3p=k(o,x,v,h){a d=e;a U=$6.b.M(e.r(),x,"U");a F={27:U};e.1o(k(q){d.2p([U],k(f){F["27"]=f.12[0];d.1P("1u://1D.14.15/1C.8/2w/69","4u",F,7,k(G,f){a w=f;9(G===$6.b.s.13){w={};w["1e"]=f;a 17=f["17"];a 3A=17.2N("3z");9(3A>=0){17=17.68(3A+1)}w["3x"]=17;d.1P("1u://1D.14.15/1C.8/"+q["18"]+"3z"+17,"2v",7,7,k(G,f){9(G===$6.b.s.13){w["1e"]=f;w["U"]=f["27"]}9(h!=7){h(G,w,q,v)}})}l{9(h!=7){h(G,w,q,v)}}})})})};t.u.4q=k(o,x,v,h){a d=e;a 1h=7;a B=$6.b.M(e.r(),x,"B");9(1x.u.1G.1F(B)==="[1w 1S]"){1h=B[0]}e.4n(1h,k(28){9(28){a 2x="67/66-65";9(/\\.64?g$/.2n(28)){2x="1h/63"}l 9(/\\.4w$/.2n(28)){2x="1h/4w"}l 9(/\\.4v$/.2n(28)){2x="1h/4v"}a 2o={62:28,61:2x};a F={3y:"@2o("+$6.10.3l(2o)+")"};a U=$6.b.M(d.r(),x,"U");9(U!=7){F["27"]=U}d.1o(k(q){d.2p([U],k(f){F["27"]=f.12[0];d.1P("1u://1D.14.15/1C.8/2w/60","4u",F,7,k(G,f){a w=f;9(G===$6.b.s.13){w={};w["1e"]=f;w["3x"]=f["17"];d.1P("1u://1D.14.15/1C.8/"+q["18"]+"3z"+f["17"],"2v",7,7,k(G,f){9(G===$6.b.s.13){w["1e"]=f;w["U"]=f["27"];9(f["3y"]!=7){w["B"]=[f["3y"]]}l{9(1h!=7){a B=[];B.1y(1h);w["B"]=B}}}9(h!=7){h(G,w,q,v)}})}l{9(h!=7){h(G,w,q,v)}}})})})}l{a c=7;9(e.J==="L-K"){c="分享参数1h不能为空!"}l{c="1B 2t 1h 2s 1k 2r 2q!"}a p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}})};t.u.4p=k(o,x,v,h){a d=e;a c;a p;a z=$6.b.M(d.r(),x,"z");9(z!=7){a 4t=$6.b.M(d.r(),x,"1d");a 1v=$6.b.M(d.r(),x,"U");a B=$6.b.M(d.r(),x,"B");a 1j=7;B=$6.b.M(d.r(),x,"B");9(1x.u.1G.1F(B)==="[1w 1S]"){1j=B[0]}a A=$6.b.M(d.r(),x,"5Z");a 4s=$6.b.M(d.r(),x,"5Y");9(1j!=7){9(/^(2o\\:\\/)?\\//.2n(1j)){1j=7}}$6.N.21("15.6.20.1Z.14",k(f){9(f.12){d.2p([z],k(f){z=f.12[0];$6.N.5X(d.P(),2l,4t,1v,z,1j,A,4s,k(f){a G=f.G;a 26=f.26;a w=7;a 1e={};2j(G){1a $6.b.s.13:{w={};9(26!=7){w["3x"]=26;1e["26"]=26;w["1e"]=1e}9(1j!=7){a B=[];B.1y(1j);w["B"]=B}9(z!=7){a 1t=[];1t.1y(z);w["1t"]=1t}9(1v!=7){w["U"]=1v}R}1a $6.b.s.C:{w={y:f["y"],c:f["c"]};R}1a $6.b.s.1I:{a 2u=f["16"];9(2u!=7){1V(a 2S 5W 2u){9(2u.5V(2S)){v[2S]=2u[2S]}}}R}}9(h!=7){h(G,w,7,7)}})})}l{c=7;9(e.J==="L-K"){c="平台["+d.A()+"]需要依靠1m.1g进行分享,请先导入4r.1g后再试!"}l{c="1f ["+d.A()+"] 3w 3v 1m.1g,3u 3t 1m.1g 3s 3r 3q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}})}l{c=7;9(e.J==="L-K"){c="分享参数z不能为空!"}l{c="1B 2t z 2s 1k 2r 2q!"}p={y:$6.b.E.T,c:c};9(h!=7){h($6.b.s.C,p,7,v)}}};t.u.25=k(o,r,x,v,h){a d=e;2j(r){1a $6.b.W.33:{d.3p(o,x,v,h);R}1a $6.b.W.29:{d.4q(o,x,v,h);R}1a $6.b.W.32:{d.3o(o,x,v,h);R}1a $6.b.W.2D:{d.4p(o,x,v,h);R}3j:{a c=7;9(e.J==="L-K"){c="不支持的分享类型["+r+"]"}l{c="3k 1B r ["+r+"]"}a p={y:$6.b.E.4o,c:c};9(h!=7){h($6.b.s.C,p,7,v)}R}}};t.u.5U=k(S){a q={2J:e.r()};e.2G(q,S);H $6.10.3l(q)};t.u.2p=k(3m,h){9(e.3n()){a d=e;e.1o(k(q){$6.b.5T(d.r(),q,3m,h)})}l{9(h){h({12:3m})}}};t.u.4n=k(z,h){9(!/^(2o\\:\\/)?\\//.2n(z)){$6.N.5S(z,k(f){9(f.12!=7){9(h!=7){h(f.12)}}l{9(h!=7){h(7)}}})}l{9(h!=7){h(z)}}};t.u.4m=k(){9(e.P()!=7){H 1U}$6.D.3Q("[3P-3O] ["+e.A()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+e.A()+"]平台应用配置是否有误! "+"\\n配置:"+$6.10.3l(e.1b));H 1q};t.u.4l=k(){e.1T=7;a P=e.P();9(P!=7){e.1T="47"+P}};t.u.4k=k(1l){H 1l[V.4j]};t.u.4i=k(1l){a P=$6.10.4h(1l[V.24]);a 2m=$6.10.4h(1l[V.23]);9(P!=7){1l[V.24]=P}l{1l[V.24]=e.P()}9(2m!=7){1l[V.23]=2m}l{1l[V.23]=e.2m()}H 1l};t.u.2k=k(o,Q){a 2R="1u://m.14.15/5R/5Q?4f="+e.P()+"&4e="+2l+"&r=4d&4c=4b";9(e.22!=7){2R+="&2Q="+$6.10.2P(e.22)}l 9(Q!=7&&Q["1A"]!=7&&1x.u.1G.1F(Q["1A"])==="[1w 1S]"){2R+="&2Q="+$6.10.2P(Q["1A"].4a(","))}$6.D.5P(o,2R,2l)};t.u.4g=k(o,1J,Q){a O=e.O();a d=e;a z="5O://2M?4f="+e.P()+"&4e="+2l+"&r=4d&4c=4b";9(e.22!=7){z+="&2Q="+$6.10.2P(e.22)}l 9(Q!=7&&Q["1A"]!=7&&1x.u.1G.1F(Q["1A"])==="[1w 1S]"){z+="&2Q="+$6.10.2P(Q["1A"].4a(","))}$6.N.5N(z,k(f){9(f.12){$6.D.5M(z)}l{9(O==="2O"){d.2k(o,Q)}l{a c=7;9(e.J==="L-K"){c="分享平台["+d.A()+"]尚未安装客户端,不支持["+O+"]授权方式!"}l{c="1f["+d.A()+"]1k 5L 5K 5J,O : ["+O+"]5I 3k!"}a p={y:$6.b.E.5H,c:c};$6.D.19(o,$6.b.s.C,p)}}})};t.u.5G=k(o,Z,49,48){a d=e;9(Z.2N("47"+e.P()+"://")===0&&Z.2N("2M")===-1){$6.N.21("15.6.20.1Z.14",k(f){9(f.12){$6.N.5F(d.P(),Z,k(f){d.1o(k(q){a Y=1n[o];a I={};a v=7;9(Y!=7){I=Y["I"];v=Y["16"]}2j(f.G){1a $6.b.s.13:{a w={};w["1e"]=I;9(I["U"]!=7){w["U"]=I["U"]}9(I["1d"]!=7){w["1d"]=I["1d"]}a 1t=[];9(I["z"]!=7){1t.1y(I["z"])}9(I["X"]!=7){1t.1y(I["X"])}w["1t"]=1t;9(I["46"]!=7){w["B"]=I["46"]}l 9(I["B"]!=7){w["B"]=I["B"]}$6.D.1H(o,$6.b.s.13,w,q,v);R}1a $6.b.s.C:a 2L="";9(f.c!=7){2L=f.c}l 9(f.45!=7){2L=f.45}a p={y:$6.b.E.T,16:{y:f.y,c:2L}};$6.D.1H(o,$6.b.s.C,p,q,v);R;3j:$6.D.1H(o,$6.b.s.1I,7,q,v);R}3N 1n[o]})})}});H 1U}H 1q};t.u.44=k(o,2i){a d=e;a 1c={18:2i["18"],2I:2i["2K"],42:(2d 2c).3c()+2i["5E"]*3W,1e:2i,r:$6.b.5D.5C};a q={2J:$6.b.1R.t,1c:1c};e.2H(q,k(){d.3i(7,k(G,f){9(G===$6.b.s.13){f["1c"]=q["1c"];q=f;d.2H(q,7)}$6.D.19(o,$6.b.s.13,q)})})};t.u.43=k(q){H q.1c!=7&&q.1c.2I!=7&&q.1c.42>(2d 2c).3c()};t.u.2H=k(q,h){e.1N=q;a 1O=e.3h();$6.N.41("3Z",e.1N,1q,1O,k(f){9(h!=7){h()}})};t.u.1o=k(h){9(e.1N!=7){9(h){h(e.1N)}}l{a d=e;a 1O=e.3h();$6.N.40("3Z",1q,1O,k(f){d.1N=f!=7?f.2h:7;9(h){h(d.1N)}})}};t.u.2G=k(q,S){a 1r=7;a 1L=7;a 11=7;a i=7;9(q!=7&&S!=7){q["1e"]=S;q["18"]=S["17"];q["5B"]=S["A"];a 1M=S["3g"];a 3f=1x.u.1G.1F(1M);9(3f==="[1w 5A]"){q["1M"]=1M}l 9(3f==="[1w 1x]"&&1M["f"]!=7){q["1M"]=1M["f"]["z"]}a 1s=2;9(S["1s"]==="5z"){1s=0}l 9(S["1s"]==="5y"){1s=1}q["1s"]=1s;q["z"]=S["3e"];q["3Y"]=S["5x"];9(S["3X"]!=7){q["3Y"]=S["3X"]}q["5w"]=S["3d"]?1:0;9(S["2g"]!=7){1r=2d 2c(S["2g"]);q["2g"]=1r.3c()/3W}a 2F=S["3b"];9(2F!=7){1L=[];1V(i=0;i<2F.1K;i++){11={};a 2f=2F[i];a 1Y=2f["1Y"];9(1Y!=7&&1Y["A"]!=7){11["1Y"]=1Y["A"]}a 1X=2f["1X"];9(1X!=7&&1X["A"]!=7){11["1X"]=1X["A"]}9(2f["r"]==="5v 5u"){11["3a"]="3"}l 9(2f["r"]==="5t"){11["3a"]="4"}l{11["3a"]="5"}1L.1y(11)}q["5s"]=1L}a 2b=S["1z"];9(2b!=7){1L=[];1V(i=0;i<2b.1K;i++){11={};a 1z=2b[i];a 2e=1z["2e"];9(2e!=7&&2e["A"]!=7){11["5r"]=2e["A"]}a 1W=1z["1W"];9(1W!=7&&1W["A"]!=7){11["1W"]=1W["A"]}a 2E=1z["39"];9(2E!=7){1r=2d 2c(2E);11["39"]=1r.3U()*3T+1r.3S()+1}l{11["39"]=0}a 3V=1z["38"];9(3V!=7){1r=2d 2c(2E);11["38"]=1r.3U()*3T+1r.3S()+1}l{11["38"]=0}1L.1y(11)}q["2b"]=1L}}};t.u.37=k(h){a d=e;$6.N.5q(k(f){a 1J=7;a 1p=1q;a 3R=d.1T;9(f!=7&&f.36!=7){1V(a i=0;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 14={13:"2o"};a b(9){6.1o=9;6.J={};6.r=$1.2.2n()}b.c.9=a(){l 6.1o};b.c.2m=a(B,j){$1.1l.1k(B,$1.2.n.1g,3)};b.c.k=a(){4(6.r==="u-t"){l"邮件"}d{l"b"}};b.c.2l=a(){l"2k-y-"+$1.2.15.b};b.c.U=a(){4(6.J[14.13]!==2j){l 6.J[14.13]}l $1.2.U()};b.c.2i=a(1n){4(2h.18===0){l 6.J}d{6.J=1n}};b.c.2g=a(){};b.c.2f=a(){l 2e};b.c.1m=a(B,2d){7 8=3;4(6.r==="u-t"){8="平台["+6.k()+"]不支持授权功能!"}d{8="y["+6.k()+"]G F E 1m!"}7 i={q:$1.2.x.D,8:8};$1.1l.1k(B,$1.2.n.s,i)};b.c.2c=a(5){};b.c.2b=a(2a,5){7 8=3;4(6.r==="u-t"){8="平台["+6.k()+"]不支持获取用户信息功能!"}d{8="y["+6.k()+"]G F E 1j 29!"}7 i={q:$1.2.x.D,8:8};4(5!=3){5($1.2.n.s,i)}};b.c.28=a(B,27,5){7 8=3;4(6.r==="u-t"){8="平台["+6.k()+"]不支持添加好友方法!"}d{8="y["+6.k()+"]G F E 26 25"}7 i={q:$1.2.x.D,8:8};4(5!=3){5($1.2.n.s,i)}};b.c.24=a(23,22,5){7 8=3;4(6.r==="u-t"){8="平台["+6.k()+"不支持获取好友列表方法!"}d{8="y["+6.k()+"]G F E 1j 21 20"}7 i={q:$1.2.x.D,8:8};4(5!=3){5($1.2.n.s,i)}};b.c.1h=a(B,f,5){7 v=3;7 A=3;7 h=3;7 R=3;7 e=3;7 Q=3;7 12=3;7 11=3;7 g=6;7 S=f!=3?f["@S"]:3;7 H={"@S":S};7 9=$1.2.m(6.9(),f,"9");4(9==3){9=$1.2.o.1i}4(9===$1.2.o.1i){9=6.1f(f)}4(9!==$1.2.o.1e&&9!==$1.2.o.X&&9!==$1.2.o.Y){7 8=3;4(6.r==="u-t"){8="不支持的分享类型["+9+"]"}d{8="1Z 1h 9 ["+9+"]"}7 i={q:$1.2.x.1Y,8:8};4(5!=3){5($1.2.n.s,i,3,H)}l}$1.V.1X("1W.1.1V.1U.1T",a(j){4(j.C){v=$1.2.m(g.9(),f,"v");R=$1.2.m(g.9(),f,"R");e=$1.2.m(g.9(),f,"e");Q=$1.2.m(g.9(),f,"Q");12=$1.2.m(g.9(),f,"1S");11=$1.2.m(g.9(),f,"1R");4(9===$1.2.o.X){A=$1.2.m(g.9(),f,"h");4(1d.c.1c.1b(A)==="[1a 19]"){4(e==3){e=[]}h=A}}d 4(9===$1.2.o.Y){7 L=$1.2.m(g.9(),f,"p");4(e==3){e=[L]}}g.16([v],a(j){v=j.C[0];g.K(e,h,0,a(e){$1.V.1Q(9,v,R,e,Q,12,11,a(j){7 O=j.O;7 z=3;1P(O){10 $1.2.n.1O:{z={};z["v"]=v;4(A!=3){z["h"]=A}Z}10 $1.2.n.s:z={q:j["q"],8:j["8"]};Z;10 $1.2.n.1g:{7 I=j["1N"];4(I!=3){1M(7 P 1L I){4(I.1K(P)){H[P]=I[P]}}}Z}}4(5){5(O,z,3,H)}})})})}d{7 8=3;4(6.r==="u-t"){8="平台["+g.k()+"]需要依靠N.M进行分享,请先导入N.M后再试!"}d{8="y ["+g.k()+"] 1J 1I N.M,1H 1G N.M 1F 1E 1D!"}7 i={q:$1.2.x.1C,8:8};4(5!=3){5($1.2.n.s,i,3,H)}}})};b.c.1B=a(p,1A,1z,1y,5){7 8=3;4(6.r==="u-t"){8="平台["+6.k()+"不支持该功能!"}d{8="y["+6.k()+"]G F E 6 1x"}7 i={q:$1.2.x.D,8:8};4(5!=3){5($1.2.n.s,i)}};b.c.1w=a(1v){l 3};b.c.1f=a(f){7 9=$1.2.o.1e;7 L=$1.2.m(6.9(),f,"p");4(L!=3){9=$1.2.o.Y}7 h=$1.2.m(6.9(),f,"h");4(1d.c.1c.1b(h)==="[1a 19]"){9=$1.2.o.X}l 9};b.c.K=a(e,h,w,5){4(h==3){4(5!=3){5(e)}l}7 g=6;4(w35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('c 45="7I://7H.1K.1w";c 1f={33:"5f",32:"7G",4o:"7F",4n:"7E",5o:"7D",1n:"7C",4p:"7B"};c 1m={1J:0,1g:1};c 15={};f w(R){h.5T=R;h.1q={};h.2B=7;h.2x=7;h.2r=7;h.30=7;h.19=$6.d.7A()}w.D.R=f(){W h.5T};w.D.7z=f(p,b){$6.J.1o(p,$6.d.F.2p,7)};w.D.1e=f(){W"w"};w.D.2S=f(){a(h.1q[1f.4p]!==38){W h.1q[1f.4p]}W 1h};w.D.G=f(){a(h.1q[1f.33]!==38){W h.1q[1f.33]}W 7};w.D.31=f(){a(h.1q[1f.32]!==38){W h.1q[1f.32]}W 7};w.D.5S=f(){a(h.1q[1f.4o]!==38){W h.1q[1f.4o]}W $6.d.5S()};w.D.1n=f(){a(h.1q[1f.1n]!==38){W h.1q[1f.1n]}W 0};w.D.3Y=f(){W"5R-2H-"+$6.d.g.w+"-"+h.G()};w.D.49=f(){a(h.1q[1f.4n]!==38){W h.1q[1f.4n]}W $6.d.49()};w.D.7y=f(2y){a(7x.1k===0){W h.1q}r{h.1q=h.5n(2y);h.2B=h.5p(2y);h.5s();h.4t(h.G())}};w.D.7w=f(){c e=h;c 2z="5R-2H";$6.A.4Z("5Q",1h,2z,f(b){a(b!=7){c 3l=b.2y;a(3l==7){3l={}}3l["7v"+e.R()]=e.G();$6.A.50("5Q",3l,1h,2z,7)}})};w.D.7u=f(){W 2X};w.D.41=f(p,1d){c x=7;a(h.5r()){a(1d==7){1d={}}a(1d["2q"]==7&&h.2B==7){1d["2q"]=["5P","7t","7s","7r","7q"]}c e=h;h.5l(f(1p,20){a(1p){e.5i(p,20,1d)}r{c l=7;a(h.19==="1b-1a"){l="分享平台["+e.1e()+"]尚未配置2D 2C:"+e.2r+",无法进行授权!"}r{l="2H["+e.1e()+"]5w 1s 4b 2D 2C:"+e.2r+",7p 4w 41!"}c x={N:$6.d.T.5v,l:l};$6.J.1o(p,$6.d.F.M,x)}})}r{c l=7;a(h.19==="1b-1a"){l="分享平台["+h.1e()+"]应用信息无效!"}r{l="2H["+h.1e()+"]5L 7o!"}x={N:$6.d.T.7n,l:l};$6.J.1o(p,$6.d.F.M,x)}};w.D.51=f(4l,o){c e=h;h.2A(f(K){a(4l!=7){c l=7;a(h.19==="1b-1a"){l="分享平台["+e.1e()+"]不支持获取其他用户资料!"}r{l="2H ["+e.1e()+"]4d 1s 4c 5x 7m\'s 7l!"}c x={N:$6.d.T.3E,l:l};a(o!=7){o($6.d.F.M,x)}W}e.5O("3B://5j.1K.1w/K/5P","4i",7,7,f(17,b){c Y=b;a(17===$6.d.F.1X){Y={3Z:$6.d.g.1g,1Y:K.1y.1Y};e.3X(Y,b);a(Y["1Y"]===K["1Y"]){Y["1y"]=K["1y"]}}a(o!=7){o(17,Y)}})})};w.D.5O=f(q,5N,1v,5M,o){c x=7;c e=h;h.2A(f(K){a(K!=7){a(1v==7){1v={}}1v["7k"]=e.G();a(K.1y!=7){1v["29"]=K.1y.3i;1v["2R"]=K.1y.3h.2R}$6.A.4j($6.d.g.1g,7,q,5N,1v,5M,f(b){a(b!=7){a(b["N"]!=7){a(o){o($6.d.F.M,b)}}r{c 1I=$6.O.4h($6.O.3H(b["3L"]));a(b["4k"]===5J){a(o){o($6.d.F.1X,1I)}}r{c 4m=$6.d.T.1c;1t(1I["N"]){Q 7j:Q 7i:Q 7h:Q 7g:Q 7f:Q 7e:Q 7d:4m=$6.d.T.5K;L}x={N:4m,14:1I};a(o){o($6.d.F.M,x)}}}}r{x={N:$6.d.T.1c};a(o){o($6.d.F.M,x)}}})}r{c l=7;a(h.19==="1b-1a"){l="尚未授权["+e.1e()+"]用户"}r{l="5L 7c ["+e.1e()+"]"}x={N:$6.d.T.5K,l:l};a(o){o($6.d.F.M,x)}}})};w.D.7b=f(p,18){c x=7;c l;c e=h;c 3M=$6.O.2b(18);a(3M!=7&&3M.4l!=7){c 1v=$6.O.7a(3M.79);a(1v!=7&&1v.29!=7){c 37;a(e.2S()){37={29:1v.29,1H:"1"}}r{37={29:1v.29}}$6.A.4j($6.d.g.1g,7,"3B://5G.1K.1w/47.0/5F","4i",37,7,f(b){a(b!=7){a(b["N"]!=7){$6.J.1o(p,$6.d.F.M,b)}r a(b["4k"]!=7&&b["4k"]===5J){c 36=$6.O.3H(b["3L"]);c 3K=3w 5E("{[\\\\s\\\\S]+}");c C=3K.5D(36);c 1I=$6.O.4h(C[0]);a(1I.2R!=7){a(1I.1H!=7){1v.1H=1I.1H}1v["2R"]=1I.2R;e.1Z(p,1v)}r{x={N:$6.d.T.1c,14:1I};$6.J.1o(p,$6.d.F.M,x)}}r{x={N:$6.d.T.1c,14:b};$6.J.1o(p,$6.d.F.M,x)}}r{x={N:$6.d.T.1c};$6.J.1o(p,$6.d.F.M,x)}})}r{l=7;a(h.19==="1b-1a"){l="无效的授权回调:["+18+"]"}r{l="5I o q:["+18+"]"}x={N:$6.d.T.5H,l:l};$6.J.1o(p,$6.d.F.M,x)}}r{l=7;a(h.19==="1b-1a"){l="无效的授权回调:["+18+"]"}r{l="5I o q:["+18+"]"}x={N:$6.d.T.5H,l:l};$6.J.1o(p,$6.d.F.M,x)}};w.D.3y=f(p,b){c e=h;c 37={29:b.29,1H:"1"};$6.A.4j($6.d.g.1g,7,"3B://5G.1K.1w/47.0/5F","4i",37,7,f(35){a(35!=7){a(35["3L"]){c 36=$6.O.3H(35["3L"]);c 3K=3w 5E("{[\\\\s\\\\S]+}");c C=3K.5D(36);a(C!=7){c 1I=$6.O.4h(C[0]);a(1I.1H!=7){b.1H=1I.1H;e.1Z(p,b)}r{$6.J.1Q("[2F-2E] 1H 3J x");$6.J.1Q(36);e.1Z(p,b)}}r{$6.J.1Q("[2F-2E] 1H 3J x");$6.J.1Q(36);e.1Z(p,b)}}r{$6.J.1Q("[2F-2E] 1H 3J x");$6.J.1Q(35);e.1Z(p,b)}}r{$6.J.1Q("[2F-2E] 1H 3J x");$6.J.1Q(35);e.1Z(p,b)}})};w.D.78=f(p,18,5C,5B){c e=h;a(18.2J(h.2r+"://")===0){$6.A.3A("3z",f(b){a(b.C){$6.A.3d("1w.6.3c.3b.1K",f(b){a(b.C){$6.A.77(e.G(),18,f(b){1t(b.17){Q $6.d.F.1X:{a(e.2S()){e.3y(p,b.C)}r{e.1Z(p,b.C)}L}Q $6.d.F.M:{c x={N:$6.d.T.1c};$6.J.1o(p,$6.d.F.M,x);L}1E:$6.J.1o(p,$6.d.F.2p,7);L}})}r{e.4g(e.G(),p,18)}})}r{e.4g(e.G(),p,18)}});W 2X}W 1h};w.D.4g=f(G,p,18){c e=h;a(18.5A(0,"1u".1k)==="1u"){$6.A.76(G,p,18,$6.d.g.w,f(b){a(b.C){a(b.34["75"]===0){a(e.2S()){e.3y(p,b.34)}r{e.1Z(p,b.34)}}r{a(b.34["74"]===0){$6.J.1o(p,$6.d.F.M,b.34)}r{$6.J.1o(p,$6.d.F.2p,b.34)}}}})}};w.D.73=f(p,18,5C,5B){c e=h;a(18.2J(h.2r+"://")===0||18.2J(h.30+"://")===0){$6.A.3A("3z",f(b){a(b.C){$6.A.3d("1w.6.3c.3b.1K",f(b){a(b.C){$6.A.72(e.G(),18,f(b){e.2A(f(K){c I=15[p];c P=7;c E=7;a(I!=7){P=I["P"];E=I["14"]}1t(b.17){Q $6.d.F.1X:{c Y={};Y["3h"]=P;Y["m"]=P["m"];c 2a=[];a(P["q"]){2a.2v(P["q"])}Y["2a"]=2a;a(P["V"]!=7){Y["B"]=[P["V"]]}r a(P["Z"]!=7){Y["B"]=[P["Z"]]}$6.J.2s(p,$6.d.F.1X,Y,K,E);L}Q $6.d.F.M:c x={N:$6.d.T.1c,14:{N:b.N,l:b.l}};$6.J.2s(p,$6.d.F.M,x,K,E);L;1E:$6.J.2s(p,$6.d.F.2p,7,K,E);L}5y 15[p];15[p]=7})})}r{e.4f(p,18)}})}r{e.4f(p,18)}});W 2X}W 1h};w.D.4f=f(p,18){c e=h;a(18.5A(0,"w".1k)==="w"){c 2b={};a(18.2J("?")!==-1){c 5z=18.3k("?");c 2G=5z[1];c 3I=2G.3k("&");25(c i=0;i<3I.1k;i++){2b[3I[i].3k("=")[0]]=71(3I[i].3k("=")[1])}}a(2b["4e"]){2b["4e"]=$6.O.3H(2b["4e"])}e.2A(f(K){c I=15[p];c P=7;c E=7;a(I!=7){P=I["P"];E=I["14"]}1t(4s(2b["x"])){Q 0:{c Y={};Y["3h"]=P;Y["m"]=P["m"];c 2a=[];a(P["q"]){2a.2v(P["q"])}Y["2a"]=2a;a(P["V"]!=7){Y["B"]=[P["V"]]}r a(P["Z"]!=7){Y["B"]=[P["Z"]]}$6.J.2s(p,$6.d.F.1X,Y,K,E);L}Q-4:$6.J.2s(p,$6.d.F.2p,7,K,E);L;1E:c x={N:$6.d.T.1c,14:{N:2b["x"]},l:2b};$6.J.2s(p,$6.d.F.M,x,K,E);L}5y 15[p];15[p]=7})}};w.D.70=f(){h.3v(7,7)};w.D.6Z=f(p,K,o){c l=7;a(h.19==="1b-1a"){l="平台["+h.1e()+"]不支持添加好友方法!"}r{l="2H["+h.1e()+"]4d 1s 4c 6Y 6X"}c x={N:$6.d.T.3E,l:l};a(o!=7){o($6.d.F.M,x)}};w.D.6W=f(6V,6U,o){c l=7;a(h.19==="1b-1a"){l="平台["+h.1e()+"不支持获取好友列表方法!"}r{l="2H["+h.1e()+"]4d 1s 4c 5x 6T 6S"}c x={N:$6.d.T.3E,l:l};a(o!=7){o($6.d.F.M,x)}};w.D.1D=f(p,v,o){c e=h;c 3F=v!=7?v["@6R"]:1h;e.24(3F,p,v,o)};w.D.24=f(3F,p,v,o){c e=h;c 3G=v!=7?v["@3G"]:7;c E={"@3G":3G};a(3F){e.5u(p,v,E,o)}r{$6.A.6Q(f(b){a(b.C){e.5k(f(1p,20){a(1p){$6.A.3A("3z",f(b){a(b.C){$6.A.3d("1w.6.3c.3b.1K",f(b){a(b.C){e.4V(p,v,E,o)}r{e.3W(p,v,E,o)}})}r{e.3W(p,v,E,o)}})}r{c l=7;a(h.19==="1b-1a"){l="尚未配置["+e.1e()+"]2D 2C:"+e.30+", 无法进行分享。"}r{l="6P\'t 1D 6O 13["+e.1e()+"]5w 1s 4b 2D 2C:"+e.30+"!6N 6M 6L 6K 4b 2D 2C!"}c x={N:$6.d.T.5v,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}})}r{c x={N:$6.d.T.3E,l:"应用已禁用后台模式,分享平台["+e.1e()+"]无法进行分享! 请在项目设置中开启后台模式后再试!"};a(o!=7){o($6.d.F.M,x,7,E)}}})}};w.D.5u=f(p,v,E,o){c g=7;c U=v["3V"];a(U==7){U=1m.1J}1t(U){Q 1m.1g:g=$6.d.g.1g;L;1E:g=$6.d.g.1J;L}c R=$6.d.H(g,v,"R");a(R==7){R=$6.d.X.2P}a(R===$6.d.X.2P){R=h.3n(v,g)}c e=h;c Y;1t(R){Q $6.d.X.3m:Q $6.d.X.6J:Q $6.d.X.3P:Q $6.d.X.3O:Q $6.d.X.6I:{e.24(1h,p,v,o);L}Q $6.d.X.39:{c B=$6.d.H(g,v,"B");a(1C.D.1r.1B(B)==="[1A 1z]"){a(B.1k>9){B.1k=9}r a(B.1k===0){B=7}}a(B!=7){$6.A.4a($6.d.X.39,B,e.1n(),f(b){c 17=b.17;a(17!=7){Y={13:g,U:U,B:B};Y["B"]=B;e.3C(17,p,Y,E)}r{e.24(1h,p,v,o)}})}r{e.24(1h,p,v,o)}L}Q $6.d.X.3a:{c q=$6.d.H(g,v,"q");a(q!=7){$6.A.4a($6.d.X.3a,q,e.1n(),f(b){c 17=b.17;a(17!=7){Y={13:g,U:U,q:q};Y["2a"]=[q];e.3C(17,p,Y,E)}r{e.24(1h,p,v,o)}})}r{e.24(1h,p,v,o)}L}Q $6.d.X.5t:{c 3D=$6.d.H(g,v,"q");a(3D!=7){$6.A.4a($6.d.X.5t,3D,e.1n(),f(b){c 17=b.17;a(17!=7){Y={13:g,U:U,6H:3D};e.3C(17,p,Y,E)}r{e.24(1h,p,v,o)}})}r{e.24(1h,p,v,o)}L}1E:{e.24(1h,p,v,o);L}}};w.D.3C=f(17,p,v,E){c e=h;e.2A(f(K){a(17===$6.d.F.2p){$6.J.2s(p,$6.d.F.2p,7,K,E)}r{$6.J.2s(p,$6.d.F.1X,v,K,E)}})};w.D.6G=f(1O){c K={3Z:h.R()};h.3X(K,1O);W $6.O.5q(K)};w.D.1G=f(g,48,o){a(h.49()){h.2A(f(K){$6.d.6F(g,K,48,o)})}r{a(o){o({C:48})}}};w.D.6E=f(K){W K.1y!=7&&K.1y.3i!=7&&K.1y.54>(3w 53).52()};w.D.5s=f(){h.2r=7;c G=h.G();a(G!=7){h.2r="1u"+G;c 2y=6D(h.G());c 2G=2y.1r(16).4q();6C(2G.1k<8){2G="0"+2G}h.30="w"+2G}};w.D.5r=f(){a(h.G()!=7&&h.31()!=7){W 2X}$6.J.1Q("[2F-2E] ["+h.1e()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+h.1e()+"]平台应用配置是否有误! "+"\\n配置:"+$6.O.5q(h.1q));W 1h};w.D.5p=f(23){W 23[1f.5o]};w.D.5n=f(23){c G=$6.O.5m(23[1f.33]);c 31=$6.O.5m(23[1f.32]);a(G!=7){23[1f.33]=G}r{23[1f.33]=h.G()}a(31!=7){23[1f.32]=31}r{23[1f.32]=h.31()}W 23};w.D.5l=f(o){c e=h;$6.A.1M(f(b){c 20=7;c 2U="";c 1p=1h;c 2V=e.2r;a(b!=7&&b.2Z!=7){25(c i=0;i0){c 3U=0;c 3q=[];25(c k 6f B){a(B.6e(k)){c 4S=B[k];$6.A.3f(4S,7,$6.d.g.w,f(b){3U++;a(b.2t["Z"]){3q.2v(b.2t["Z"])}a(3U===B.1k){c 3g=[];c 3r=3q.1k;c 4P="$7";c 4O={$4Q:{2O$2N:3r+5},"3T.6d":[{2O$2N:2}],"3T.3Q":[{2O$2N:3}]};c 4N="6c";c 3R={};c 3S=[];25(c i=0;i<3r;i++){c 4R={2O$2N:i+4};3S.2v(4R)}3R={$4Q:{2O$2N:3r+4},"3T.3Q":3S};3g.2v(4P,4O,4N,3R);3g.2v(3q);c 4H={$4L:["4M","4K"],$4J:"4M"};c 4G={$4L:["4I","6b","4K"],$4J:"4I"};3g.2v(4H,4G);c 4F={$6a:"69",$3Q:3g,$68:{67:{2O$2N:1}},$27:66};$6.A.2K($6.d.g.w,e.G(),4F,p,f(b){a(b.C){$6.A.1F(z,f(b){a(b.C){c I={};a(U===1m.1J){I={13:g,m:m,u:u,V:y,Z:Z}}r{I={13:g,m:m,u:u,V:y,Z:B}}15[p]={P:I,14:E};$6.J.1W(z)}r{c l="1K版本过低无法进行分享";x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}})}})}})}}}})})}r{$6.A.1M(f(b){c 1i=b.1j?b.1j:"";c 1l=e.26(e.G());c z="1D/2k?2j="+$6.O.12(11(1i))+"&27=1&2e=0&2d=2c&1L=1&2h="+"w"+1l+"&2g=2f&2u=0&2i=";e.2l(f(1x){z=1x+z+"65&u="+$6.O.12(11(u?u:""))+"&2M=2L&3p="+$6.O.12(11(m?m:""));$6.A.3f(Z,y,$6.d.g.w,f(b){a(b.C){1N["4D"]=b.2t["Z"];1N["2n"]=b.2t["y"];c 2m={4E:1N["4D"],3o:1N["2n"]};$6.A.2K($6.d.g.w,e.G(),2m,p,f(b){a(b.C){$6.A.1F(z,f(b){a(b.C){c I={};a(U===1m.1J){I={13:g,m:m,u:u,V:y,Z:Z}}r{I={13:g,m:m,u:u,V:y,Z:B}}15[p]={P:I,14:E};$6.J.1W(z)}})}})}})})})}})}r{l=7;a(h.19==="1b-1a"){l="分享参数Z不能为空!"}r{l="1V 1U Z 1T 1s 1S 1R!"}x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}L}Q $6.d.X.3a:{m=$6.d.H(g,v,"m");u=$6.d.H(g,v,"u");y=$6.d.H(g,v,"V");a(y==7){B=$6.d.H(g,v,"B");a(1C.D.1r.1B(B)==="[1A 1z]"){y=B[0]}}q=$6.d.H(g,v,"q");a(u!=7&&y!=7&&q!=7){h.1G(g,[m,q],f(b){m=b.C[0];q=b.C[1];c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.A.1M(f(b){c 1i=b.1j?b.1j:"";c 1l=e.26(e.G());e.2l(f(1x){c z="1D/2k?2j="+$6.O.12(11(1i))+"&27=1&2e=";1t(U){Q 1m.1g:z=z+1;L;1E:z=z+0;L}z=1x+z+"&2d=2c&1L=1&2h=w"+1l+"&2g=2f&2u=0&2i=";z=z+"64&u="+$6.O.12(11(u?u:""))+"&q="+$6.O.12(11(q?q:""))+"&3p="+$6.O.12(11(m?m:""))+"&2M=2L";$6.A.3f(7,y,$6.d.g.w,f(b){a(b.C){1N["2n"]=b.2t["y"];c 2m={3o:1N["2n"]};$6.A.2K($6.d.g.w,e.G(),2m,p,f(b){a(b.C){$6.A.1F(z,f(b){a(b.C){c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.J.1W(z)}})}})}})})})})}r{l=7;a(h.19==="1b-1a"){l="分享参数u、y、q不能为空!"}r{l="1V 1U u、y、q 1T 1s 1S 1R!"}x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}L}Q $6.d.X.3P:{m=$6.d.H(g,v,"m");u=$6.d.H(g,v,"u");y=$6.d.H(g,v,"V");a(y==7){B=$6.d.H(g,v,"B");a(1C.D.1r.1B(B)==="[1A 1z]"){y=B[0]}}q=$6.d.H(g,v,"q");2o=$6.d.H(g,v,"4C");a(u!=7&&y!=7&&q!=7){h.1G(g,[m,q],f(b){m=b.C[0];q=b.C[1];c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.A.1M(f(b){c 1i=b.1j?b.1j:"";c 1l=e.26(e.G());e.2l(f(1x){c z="1D/2k?2j="+$6.O.12(11(1i))+"&27=1&2e=";1t(U){Q 1m.1g:z=z+1;L;1E:z=z+0;L}z=1x+z+"&2d=2c&1L=1&2h=w"+1l+"&2g=2f&2u=0&2i=";z=z+"63&u="+$6.O.12(11(u?u:""))+"&q="+$6.O.12(11(q?q:""))+"&3p="+$6.O.12(11(m?m:""))+"&2M=2L";a(2o){z=z+"&4A="+$6.O.12(11(2o?2o:""))}$6.A.3f(7,y,$6.d.g.w,f(b){a(b.C){1N["2n"]=b.2t["y"];c 2m={3o:1N["2n"]};$6.A.2K($6.d.g.w,e.G(),2m,p,f(b){a(b.C){$6.A.1F(z,f(b){a(b.C){c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.J.1W(z)}})}})}})})})})}r{l=7;a(h.19==="1b-1a"){l="分享参数u、y、q不能为空!"}r{l="1V 1U u、y、q 1T 1s 1S 1R!"}x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}L}Q $6.d.X.3O:{m=$6.d.H(g,v,"m");u=$6.d.H(g,v,"u");y=$6.d.H(g,v,"V");a(y==7){B=$6.d.H(g,v,"B");a(1C.D.1r.1B(B)==="[1A 1z]"){y=B[0]}}q=$6.d.H(g,v,"q");28=$6.d.H(g,v,"4B");a(u!=7&&y!=7&&q!=7){h.1G(g,[m,q],f(b){m=b.C[0];q=b.C[1];c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.A.1M(f(b){c 1i=b.1j?b.1j:"";c 1l=e.26(e.G());e.2l(f(1x){c z="1D/2k?2j="+$6.O.12(11(1i))+"&27=1&2e=";1t(U){Q 1m.1g:z=z+1;L;1E:z=z+0;L}z=1x+z+"&2d=2c&1L=1&2h=w"+1l+"&2g=2f&2u=0&2i=";z=z+"4x&u="+$6.O.12(11(u?u:""))+"&q="+$6.O.12(11(q?q:""))+"&3p="+$6.O.12(11(m?m:""))+"&2M=2L";a(28){z=z+"&4A="+$6.O.12(11(28?28:""))}$6.A.3f(7,y,$6.d.g.w,f(b){a(b.C){1N["2n"]=b.2t["y"];c 2m={3o:1N["2n"]};$6.A.2K($6.d.g.w,e.G(),2m,p,f(b){a(b.C){$6.A.1F(z,f(b){a(b.C){c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.J.1W(z)}})}})}})})})})}r a(q!=7&&q.2J("4z-4y://")===0&&U===1m.1g){h.1G(g,[m,q],f(b){m=b.C[0];q=b.C[1];a(g===$6.d.g.1g){$6.A.62(f(b){a(b.C){c l=7;a(h.19==="1b-1a"){l="61暂不支持分享本地视频到空间!"}r{l="w 25 60 5Z\'t 5Y 1D 4x 4w 5X!"}x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}r{$6.A.1M(f(b){c 1i=b.1j?b.1j:"";c 1l=e.26(e.G());e.2l(f(1x){c z="1D/2k?2j="+$6.O.12(11(1i))+"&2i=3N&2h=w"+1l+"&2g=2f&27=1&2e=0&2d=2c&1L=1&3e=3.1";a(m){z=z+"&u=="+$6.O.12(11(m?m:""))}z=1x+z+"&5W="+$6.O.12(11(q?q:""));$6.A.1F(z,f(b){a(b.C){c I={13:g,m:m,u:u,V:y,q:q};15[p]={P:I,14:E};$6.J.1W(z)}})})})}})}})}r{l=7;a(h.19==="1b-1a"){l="分享参数u、y、q不能为空!"}r{l="1V 1U u、y、q 1T 1s 1S 1R!"}x={N:$6.d.T.1c,l:l};a(o!=7){o($6.d.F.M,x,7,E)}}L}1E:{l=7;a(h.19==="1b-1a"){l="不支持的分享类型["+R+"]"}r{l="4v 1D R ["+R+"]"}x={N:$6.d.T.4u,l:l};a(o!=7){o($6.d.F.M,x,7,E)}L}}};w.D.4t=f(G){a(G!=7){$6.A.3d("1w.6.3c.3b.1K",f(b){a(b.C){$6.J.5V(G)}})}};w.D.3n=f(v,g){c R=$6.d.X.3m;c u=$6.d.H(g,v,"u");c y=$6.d.H(g,v,"V");c q=$6.d.H(g,v,"q");c B=$6.d.H(g,v,"B");a(u!=7&&(y!=7||1C.D.1r.1B(B)==="[1A 1z]")&&q!=7){R=$6.d.X.3a}r a(1C.D.1r.1B(B)==="[1A 1z]"&&g===$6.d.g.1J){R=$6.d.X.39}W R};w.D.26=f(4r){c 2I=4s(4r).1r(16).4q();a(2I.1k<8){25(c i=0;i<8-2I.1k;i++){2I="0"+2I}}W 2I};$6.d.5U($6.d.g.w,w);',62,479,'||||||mob|null|||if|data|var|shareSDK|self|function|platformType|this||||error_message|text||callback|sessionId|url|else|||title|parameters|QQ|error|thumbImage|urlstring|ext|images|result|prototype|userData|responseState|appId|getShareParam|shareParams|native|user|break|Fail|error_code|utils|content|case|type||errorCode|scene|thumb_image|return|contentType|resultData|image||utf16to8|base64Encode|platform|user_data|QQShareContentSet||state|callbackUrl|_currentLanguage|Hans|zh|APIRequestFail|settings|name|QQAppInfoKeys|QZone|false|appName|CFBundleDisplayName|length|callbackName|QQScene|QQShareType|ssdk_authStateChanged|hasReady|_appInfo|toString|not|switch|tencent|params|com|urlProtocol|credential|Array|object|apply|Object|share|default|canOpenURL|_convertUrl|unionid|response|QQFriend|qq|generalpastboard|getAppConfig|shareParameter|rawData|scope|log|nil|be|can|param|Share|openURL|Success|uid|_succeedAuthorize|urlScheme|authUrl|typeObj|appInfo|_checkShare|for|_getFormatNum|version|videoFlashUrl|access_token|urls|parseUrl|scheme|callback_type|cflag|app|src_type|callback_name|file_type|thirdAppDisplayName|to_fri|_checkShareType|shareData|thumbData|audioFlashUrl|Cancel|scopes|_authUrlScheme|ssdk_shareStateChanged|returnData|shareType|push|gender|_currentUser|value|domain|_getCurrentUser|_authScopes|Scheme|URL|WARNING|ShareSDK|str|Platform|formatNum|indexOf|ssdk_setDataToPasteboard|pasteboard|objectlocation|UID|CF|Auto|credentialRawData|openid|backUnionid|deviceModel|warningLog|callbackScheme|schema|true|CFBundleURLSchemes|CFBundleURLTypes|_shareUrlScheme|appKey|AppKey|AppID|retDic|backData|responseString|getOpenIDParams|undefined|Image|WebPage|connector|sharesdk|isPluginRegisted|sdkv|ssdk_getImageData|objectsValue|raw_data|token|otherURLString|split|curApps|Text|_getShareType|previewimagedata|description|imageArray|imageCount|mqqapi|otherURL|firstURL|_setCurrentUser|new|SSoLogin|getUnionid|QQApiInterface|ssdk_isConnectedPlatformSDK|https|_extensionShareFinish|sourceFile|UnsupportFeature|enableExtensionShare|flags|base64Decode|strs|get|reg|response_data|urlInfo|qzone|Video|Audio|objects|publicItem3|arrayListOfItem3|NS|times|qq_scene|_sharewithoutsdk|_updateUserInfo|cacheDomain|platform_type|authData|authorize|systemVersion|MOBSystemVersion|_ssoAuthorizeWithoutSDK|QQRedirectUri|urlEncode|oauth2|contents|convertUrlEnabled|ssdk_QQExtensionShare|set|support|do|error_description|_handleShareCallbackWithoutSDK|_handleSSOCallbackWithoutSDK|jsonStringToObject|GET|ssdk_callHTTPApi|status_code|query|code|ConvertUrl|AuthType|BackUnionid|toUpperCase|rawNum|Number|_setupApp|UnsupportContentType|unsupported|to|video|library|assets|flashurl|video_flash_url|audio_flash_url|fileData|file_data|valueDic|publicItemBottomFirst|publicItemBottomSeccond|NSMutableDictionary|classname|NSObject|classes|NSArray|publicItem2|publicItem1|publicItem0|class|dic|imagePath|timapi|ssdk_qqShareVideo|_share|level|nickname|currentUser|getCacheData|setCacheData|getUserInfo|getTime|Date|expired|_webAuthorize|timOpensdkSSoLogin|mqqOpensdkSSoLogin|status_version|status_os|status_machine|sdkp|join|response_type|client_id|app_id|MOBDeviceModel|scopesStr|_ssoAuthorize|openmobile|_checkShareUrlScheme|_checkUrlScheme|trim|_checkAppInfoAvailable|Scopes|_checkAuthScopes|objectToJsonString|_isAvailable|_updateCallbackURLSchemes|File|_extensionShare|UnsetURLScheme|did|getting|delete|urlObj|slice|annotation|sourceApplication|exec|RegExp|me|graph|InvalidAuthCallback|invalid|200|UserUnauth|Invalid|headers|method|callApi|get_simple_userinfo|currentApp|SSDK|authType|_type|registerPlatformClass|ssdk_plugin_qq_setup|video_assetURL|Qzone|supported|hasn|iPad|iPadQQ|isPad|audio|news|img|1e5|root|top|NSKeyedArchiver|archiver|NSDictionary|image_data_list|keys|hasOwnProperty|in|ssdk_qqShareAudio|ssdk_qqShareWebpage|ssdk_qqShareImage|ssdk_qqShareText|vip|verify_type|figureurl_2|icon|OAuth2|credentialType|1e3|expires_in|mqq|app_name|ssdk_qqAuth|ssdk_openAuthUrl|redirect_uri|mobile|display|test|m_authorize|ssdk_getDeviceModel|while|parseInt|_isUserAvaliable|convertUrl|createUserByRawData|source_file|MiniProgram|App|after|again|try|Please|because|Can|isMultitaskingSupported|extension_share|list|friend|size|cursor|getFriends|friends|adding|addFriend|cancelAuthorize|unescape|ssdk_qqHandlerShareCallback|handleShareCallback|user_cancelled|ret|ssdk_getDataFromPasteboard|ssdk_qqHandlerSSOCallback|handleSSOCallback|fragment|parseUrlParameters|handleAuthCallback|Authorization|100030|100016|100015|100014|100013|100007|100006|oauth_consumer_key|userInfo|other|InvaildPlatform|congfiguration|unable|add_share|upload_pic|add_topic|get_user_info|isSupportAuth|plat_|saveConfig|arguments|setAppInfo|authStateChanged|preferredLanguageLocalize|back_unionid|qq_share_type|auth_scopes|covert_url|auth_type|app_key|www|auth'.split('|'),0,{})) ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/ScriptCore/platforms/SinaWeibo.js ================================================ var $pluginID = "com.mob.sharesdk.SinaWeibo";eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 10={2l:"6V",2k:"6U",2j:"2R",3L:"6T",6S:"6R",4e:"6Q"};7 1A={};e w(p){h.4M=p;h.1k={};h.1X=5;h.25=5;h.1C=[];h.14=$4.a.6P();h.6O=0}w.z.p=e(){P h.4M};w.z.6N=e(u,9){$4.O.1t(u,$4.a.y.2J,5)};w.z.1f=e(){6(h.14==="17-15"){P"新浪微博"}s{P"w"}};w.z.M=e(){6(h.1k[10.2l]!==2L){P h.1k[10.2l]}P 5};w.z.29=e(){6(h.1k[10.2k]!==2L){P h.1k[10.2k]}P 5};w.z.1y=e(){6(h.1k[10.2j]!==2L){P h.1k[10.2j]}P 5};w.z.1m=e(){6(h.1k[10.3L]!==2L){P h.1k[10.3L]}P $4.a.1m()};w.z.3e=e(){P"4L-2y-"+$4.a.1o.w+"-"+h.M()};w.z.3u=e(){6(h.1k[10.3t]!==2L){P h.1k[10.3t]}P $4.a.3u()};w.z.6M=e(2x){6(6L.28===0){P h.1k}s{h.1k=h.4d(2x);h.1X=h.4f(2x);h.4c();h.3N(h.M())}};w.z.6K=e(){7 b=h;7 1W="4L-2y";$4.G.3T("4K",1B,1W,e(9){6(9!=5){7 2K=9.2x;6(2K==5){2K={}}2K["6J"+b.p()]=b.M();$4.G.3S("4K",2K,1B,1W,5)}})};w.z.6I=e(){P 20};w.z.46=e(u,Y){7 t=5;7 b=h;6(b.4b()){$4.G.2P("1l.4.2O.2N.1i",e(9){6(9){7 1m=b.1m();6(1m==="6H"){b.2z(u,Y)}s{b.47(e(1Y,1x){6(1Y){$4.G.6G(e(9){6(9.I){b.42(u,1x,Y)}s{7 t={F:$4.a.N.3f,q:"应用已禁用后台模式,分享平台["+b.1f()+"]无法进行授权! 请在项目设置中开启后台模式后再试!"};$4.O.1t(u,$4.a.y.J,t)}})}s{b.2z(u,Y)}})}}s{$4.O.2V("[3l-3k] 1u 6F 6E")}})}s{7 q=5;6(h.14==="17-15"){q="分享平台["+h.1f()+"]应用信息无效!"}s{q="2y["+h.1f()+"]6D 6C!"}t={F:$4.a.N.6B,q:q};$4.O.1t(u,$4.a.y.J,t)}};w.z.6A=e(u,1J){7 b=h;7 3a=$4.S.4J(1J);6(3a!=5&&3a.1U!=5){7 E=$4.S.2H(3a.1U);6(E.V==5||E.Z==5){7 t={F:$4.a.N.X};$4.O.1t(u,$4.a.y.J,t)}s{b.2X(u,E)}}};w.z.6z=e(u,1J,4I,4H){7 b=h;2g(7 i=0;i0}6(o!=5){o(U,A)}})})};w.z.1b=e(u,v,o){7 b=h;7 35=v!=5?v["@35"]:5;7 C={"@35":35};7 p=$4.a.L(h.p(),v,"p");6(p==5){p=$4.a.11.2G}7 4r=v!=5?v["@5V"]:1B;6(4r){b.4j(p,v,C,o)}s{b.4q(u,p,v,C,o)}};w.z.5U=e(12){7 k={2h:h.p()};h.2w(k,12);P $4.S.3r(k)};w.z.4q=e(u,p,v,C,o){7 l=5;7 D=5;7 H=5;7 t=5;7 b=h;7 q;7 R;7 B;$4.G.41("40",e(9){6(9.I){6(p===$4.a.11.2G){p=b.2v(v,20)}22(p){W $4.a.11.2u:{l=$4.a.L(b.p(),v,"l");6(l!=5){b.1z([l],e(9){l=9.I[0];b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.5T(b.M(),l,V,e(9){7 13={2r:b.p(),l:l};1A[u]={Q:13,1h:C}})})})}s{q=5;6(b.14==="17-15"){q="分享参数l不能为空!"}s{q="1b 1R l 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2b:{l=$4.a.L(b.p(),v,"l");H=$4.a.L(b.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(D!=5){b.1z([l],e(9){l=9.I[0];b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.5S(b.M(),l,D,V,e(9){7 13={2r:b.p(),l:l,D:D};1A[u]={Q:13,1h:C}})})})}s{q=5;6(b.14==="17-15"){q="分享参数D不能为空!"}s{q="1b 1R D 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2M:{l=$4.a.L(b.p(),v,"l");R=$4.a.L(b.p(),v,"R");B=$4.a.L(b.p(),v,"B");7 19=$4.a.L(b.p(),v,"3b");6(19==5){19=(2e 2d).2c().1d()}H=$4.a.L(b.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(R!=5&&B!=5&&19!=5&&D!=5){b.1z([l,B],e(9){l=9.I[0];B=9.I[1];b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.5R(b.M(),R,l,D,B,19,V,e(9){7 13={2r:b.p(),l:l,R:R,2q:D,B:B};1A[u]={Q:13,1h:C}})})})}s{q=5;6(b.14==="17-15"){q="分享参数R、B、19、D不能为空!"}s{q="1b 1R R、B、19、D 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}2o:{q=5;6(b.14==="17-15"){q="不支持的分享类型["+p+"]"}s{q="2Z 1b p ["+p+"]"}t={F:$4.a.N.2Y,q:q};6(o!=5){o($4.a.y.J,t,5,C)}T}}}s{$4.G.27(["34://33","5Q://","5P://"],e(9){6(9.I){6(p===$4.a.11.2G){p=b.2v(v,20)}7 1I={};7 1w=b.4l();7 1H={};22(p){W $4.a.11.2u:{l=$4.a.L(b.p(),v,"l");6(l!=5){b.1z([l],e(9){l=9.I[0];1I={2I:"3B",l:l?l:""};1H["1I"]=1I;1H["1w"]=1w;7 13={2r:b.p(),l:l,R:R,2q:D,B:B};1A[u]={Q:13,1h:C};$4.G.3A($4.a.1o.w,b.M(),1H,u,e(9){6(9.I){7 1T="34://33?3z="+1w+"&3y=3x";$4.G.27(1T,e(9){6(9.I){$4.O.2f(1T)}})}})})}s{q=5;6(b.14==="17-15"){q="分享参数l不能为空!"}s{q="1b 1R l 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2b:{l=$4.a.L(b.p(),v,"l");H=$4.a.L(b.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(D!=5){b.1z([l],e(9){l=9.I[0];$4.G.4p(D,5,$4.a.1o.w,e(9){6(9.I){1I={2I:"3B",5O:{5N:9.4o["D"]},l:l?l:""};1H["1I"]=1I;1H["1w"]=1w;7 13={2r:b.p(),l:l,R:R,2q:D,B:B};1A[u]={Q:13,1h:C};$4.G.3A($4.a.1o.w,b.M(),1H,u,e(9){6(9.I){7 1T="34://33?3z="+1w+"&3y=3x";$4.G.27(1T,e(9){6(9.I){$4.O.2f(1T)}})}})}})})}s{q=5;6(b.14==="17-15"){q="分享参数D不能为空!"}s{q="1b 1R D 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2M:{l=$4.a.L(b.p(),v,"l");R=$4.a.L(b.p(),v,"R");B=$4.a.L(b.p(),v,"B");7 19=$4.a.L(b.p(),v,"3b");6(19==5){19=(2e 2d).2c().1d()}H=$4.a.L(b.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(R!=5&&B!=5&&19!=5&&D!=5){b.1z([l,B],e(9){l=9.I[0];B=9.I[1];$4.G.4p(D,D,$4.a.1o.w,e(9){6(9.I){1I={2I:"3B",l:l?l:"",5M:{2I:"5L",3Q:l?l:"",5K:"5J",5I:9.4o["5H"],R:R?R:"",5G:B?B:""}};1H["1I"]=1I;1H["1w"]=1w;7 13={2r:b.p(),l:l,R:R,2q:D,B:B};1A[u]={Q:13,1h:C};$4.G.3A($4.a.1o.w,b.M(),1H,u,e(9){6(9.I){7 1T="34://33?3z="+1w+"&3y=3x";$4.G.27(1T,e(9){6(9.I){$4.O.2f(1T)}})}})}})})}s{q=5;6(b.14==="17-15"){q="分享参数R、B、19、D不能为空!"}s{q="1b 1R R、B、19、D 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}2o:{q=5;6(b.14==="17-15"){q="不支持的分享类型["+p+"]"}s{q="2Z 1b p ["+p+"]"}t={F:$4.a.N.2Y,q:q};6(o!=5){o($4.a.y.J,t,5,C)}T}}}s{b.4n(u,p,v,C,o)}})}})};w.z.4n=e(u,p,v,C,o){7 b=h;7 t;7 q;7 18;6(p===$4.a.11.2G){p=b.2v(v,20)}7 l;22(p){W $4.a.11.2u:{l=$4.a.L(b.p(),v,"l");6(l!=5){b.1z([l],e(9){l=9.I[0];$4.G.2T(b.M(),e(9){18=9["18"];6(18!=5){b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.4m(b.M(),18,V,l,e(9){6(9.U){6(o!=5){o(9.U,5,k,C)}}s{7 A;6(9.2p!=5){7 v=$4.S.2H(9.2p);7 1g=v.1g;6(1g==0){A={};A["l"]=l;A["1e"]=v;6(o!=5){$4.O.1S(u,$4.a.y.1a,A,k,C)}}s{6(o!=5){t={F:$4.a.N.X,q:v.3w};o($4.a.y.J,t,k,C)}}}s{6(o!=5){o($4.a.y.J,5,k,C)}}}})})}s{6(o!=5){t={F:$4.a.N.X,q:9.t};o($4.a.y.J,t,5,C)}}})})}s{q=5;6(b.14==="17-15"){q="分享参数l不能为空!"}s{q="1b 1R l 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2b:{l=$4.a.L(b.p(),v,"l");7 D;7 H=$4.a.L(b.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(l!=5&&D!=5){b.1z([l],e(9){l=9.I[0];$4.G.2T(b.M(),e(9){18=9["18"];6(18!=5){b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.5F(b.M(),18,V,l,D,e(9){6(9.U){6(o!=5){o(9.U,5,k,C)}}s{7 A;6(9.2p!=5){7 v=$4.S.2H(9.2p);7 1g=v.1g;6(1g==0){A={};A["l"]=l;A["H"]=[D];A["1e"]=v;6(o!=5){$4.O.1S(u,$4.a.y.1a,A,k,C)}}s{6(o!=5){t={F:$4.a.N.X,q:v.3w};o($4.a.y.J,t,k,C)}}}s{6(o!=5){o($4.a.y.J,5,k,C)}}}})})}s{6(o!=5){t={F:$4.a.N.X,q:9.t};o($4.a.y.J,t,5,C)}}})})}s{q=5;6(b.14==="17-15"){q="分享参数l D 不能为空!"}s{q="1b 1R l D 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}W $4.a.11.2M:{l=$4.a.L(b.p(),v,"l");7 B=$4.a.L(b.p(),v,"B");6(l!=5&&B!=5){b.1z([l,B],e(9){l=9.I[0];B=9.I[1];$4.G.2T(b.M(),e(9){18=9["18"];6(18!=5){b.1j(e(k){7 V="";6(k!=5&&k.K!=5){V=k.K.1E}$4.G.4m(b.M(),18,V,l+" "+B,e(9){6(9.U){6(o!=5){o(9.U,5,k,C)}}s{7 A;6(9.2p!=5){7 v=$4.S.2H(9.2p);7 1g=v.1g;6(1g==0){A={};A["l"]=l;A["1G"]=[B];A["1e"]=v;6(o!=5){$4.O.1S(u,$4.a.y.1a,A,k,C)}}s{6(o!=5){t={F:$4.a.N.X,q:v.3w};o($4.a.y.J,t,k,C)}}}s{6(o!=5){o($4.a.y.J,5,k,C)}}}})})}s{6(o!=5){t={F:$4.a.N.X,q:9.t};o($4.a.y.J,t,5,C)}}})})}s{q=5;6(b.14==="17-15"){q="分享参数l不能为空!"}s{q="1b 1R l 1Q 1u 1P 1O!"}t={F:$4.a.N.X,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}T}2o:{q=5;6(b.14==="17-15"){q="不支持的分享类型["+p+"]"}s{q="2Z 1b p ["+p+"]"}t={F:$4.a.N.2Y,q:q};6(o!=5){o($4.a.y.J,t,5,C)}T}}};w.z.4l=e(){7 d=(2e 2d).2c();7 1w="5E-5D-5C-5B-5A".5z(/[5y]/g,e(c){7 r=(d+4k.5x()*16)%16|0;d=4k.5w(d/16);P(c=="x"?r:r&3|8).1d(16)});P 1w};w.z.4j=e(p,v,C,o){7 l=5;7 1c=5;7 1F=5;7 b=h;7 B=5;7 E=5;6(p===$4.a.11.2G){p=b.2v(v,1B)}22(p){W $4.a.11.2u:{l=$4.a.L(h.p(),v,"l");6(l!=5){E={2E:l};B="1N://21.1i.1l/2/3v/1b.2n";1c=$4.a.L(h.p(),v,"1c");1F=$4.a.L(h.p(),v,"2m");6(1c!=5&&1F!=5){E["1c"]=1c;E["2m"]=1F}}T}W $4.a.11.2b:{7 D=5;7 H=$4.a.L(h.p(),v,"H");6(1s.z.1d.1r(H)==="[1q 1p]"){D=H[0]}6(D!=5){6(/^(31\\:\\/)?\\//.32(D)){7 2F="5v/5u-5t";6(/\\.5s?g$/.32(D)){2F="D/5r"}s 6(/\\.4i$/.32(D)){2F="D/4i"}s 6(/\\.4h$/.32(D)){2F="D/4h"}7 31={5q:D,5p:2F};E={5o:"@31("+$4.S.3r(31)+")"};l=$4.a.L(h.p(),v,"l");l=$4.S.1K(l);6(l!=5){E["2E"]=l}B="1N://21.1i.1l/2/3v/1b.2n";1c=$4.a.L(h.p(),v,"1c");1F=$4.a.L(h.p(),v,"2m");6(1c!=5&&1F!=5){E["1c"]=1c;E["2m"]=1F}}s{B="1N://21.1i.1l/2/3v/5n.2n";E={B:D};l=$4.a.L(h.p(),v,"l");6(l!=5){E["2E"]=l}1c=$4.a.L(h.p(),v,"1c");1F=$4.a.L(h.p(),v,"2m");6(1c!=5&&1F!=5){E["1c"]=1c;E["2m"]=1F}}}T}}6(B!=5&&E!=5){h.1j(e(k){7 2D=[E["2E"]];b.1z(2D,e(9){E["2E"]=9.I[0];b.2a(B,"30",E,5,e(U,9){7 A=9;6(U===$4.a.y.1a){A={};A["1e"]=9;A["5m"]=9["2Q"];A["l"]=9["l"];6(9["4g"]!=5){A["H"]=[9["4g"]]}}6(o!=5){o(U,A,k,C)}})})})}s{7 q=5;6(h.14==="17-15"){q="不支持的分享类型["+p+"]"}s{q="2Z 1b p ["+p+"]"}7 t={F:$4.a.N.2Y,q:q};6(o!=5){o($4.a.y.J,t,5,C)}}};w.z.1z=e(2D,o){6(h.3u()){7 b=h;h.1j(e(k){$4.a.3t(b.p(),k,2D,o)})}s{6(o){o({I:2D})}}};w.z.4f=e(1n){P 1n[10.4e]};w.z.4d=e(1n){7 M=$4.S.3s(1n[10.2l]);7 29=$4.S.3s(1n[10.2k]);7 1y=$4.S.3s(1n[10.2j]);6(M!=5){1n[10.2l]=M}s{1n[10.2l]=h.M()}6(29!=5){1n[10.2k]=29}s{1n[10.2k]=h.29()}6(1y!=5){1n[10.2j]=1y}s{1n[10.2j]=h.1y()}P 1n};w.z.4c=e(){h.1C.5l(0);7 M=h.M();6(M!=5){h.1C.2i("3Z."+M);h.1C.2i("5k"+M)}};w.z.4b=e(){6(h.M()!=5&&h.29()!=5&&h.1y()!=5){P 20}$4.O.2V("[3l-3k] ["+h.1f()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+h.1f()+"]平台应用配置是否有误! "+"\\n配置:"+$4.S.3r(h.1k));P 1B};w.z.2X=e(u,1D){7 b=h;7 K={Z:1D["Z"],1E:1D["V"],3q:(2e 2d).2c()+1D["2W"]*4a,1e:1D,p:$4.a.49.48};7 k={2h:h.p(),K:K};h.26(k,e(){b.3p(5,e(U,9){6(U===$4.a.y.1a){9["K"]=k["K"];k=9;b.26(k,5)}$4.O.1t(u,$4.a.y.1a,k)})})};w.z.47=e(o){7 b=h;$4.G.45(e(9){7 1x=5;7 2U="";7 1Y=1B;2g(7 n=0;n35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 F={1s:"50",1r:"4Z",1q:"4Y",2U:"4X"};7 1M={};d k(m){8.1K=5;8.2S=5;8.3z=m;8.R={};8.1g=5;8.V=$3.9.4W()}k.p.m=d(){y 8.3z};k.p.I=d(){y"k"};k.p.Q=d(){6(8.R[F.1s]!==27){y 8.R[F.1s]}y 5};k.p.Z=d(){6(8.R[F.1r]!==27){y 8.R[F.1r]}y 5};k.p.1b=d(){6(8.R[F.1q]!==27){y 8.R[F.1q]}y 5};k.p.2o=d(){y"3y-1t-"+$3.9.1j.k+"-"+8.Q()};k.p.2r=d(){6(8.R[F.2U]!==27){y 8.R[F.2U]}y $3.9.2r()};k.p.4V=d(1V){6(4U.18===0){y 8.R}j{8.R=8.3h(1V)}};k.p.4T=d(){7 b=8;7 1h="3y-1t";$3.Y.3c("3x",1E,1h,d(a){6(a!=5){7 1L=a.1V;6(1L==5){1L={}}1L["4S"+b.m()]=b.Q();$3.Y.3d("3x",1L,1E,1h,5)}})};k.p.4R=d(){y 3i};k.p.25=d(s,4Q){7 o=5;7 b=8;6(8.3j()){7 v="O://13.N.M/2T/4P";7 1i={2P:8.Q(),2O:"2N-2M",2L:1w((1U 1T).1S()/2K).12(),2J:1w(2I.2H()*2G).12(),2F:"1.0"};$3.Y.2E(8.m(),5,v,"1z",5,5,1i,8.Z(),5,d(a){6(a!=5){6(a["t"]!=5){$3.z.T(s,$3.9.q.x,o)}j{7 K=$3.D.2C($3.D.1J(a["1I"]));6(a["2B"]===2A&&K==5){K=$3.D.2R($3.D.1J(a["1I"]));b.1K=K["1p"];b.2S=K["3f"];7 3w="O://13.N.M/2T/25?1p="+b.1K;$3.z.4O(s,3w,b.1b())}j{o={t:$3.9.A.S,1d:K};$3.z.T(s,$3.9.q.x,o)}}}j{7 h=5;6(8.V==="11-10"){h="分享平台["+b.I()+"]请求授权失败!"}j{h="1t ["+b.I()+"] 25 3t 3s!"}o={t:$3.9.A.S,h:h};$3.z.T(s,$3.9.q.x,o)}})}j{7 h=5;6(8.V==="11-10"){h="分享平台["+8.I()+"]应用信息无效!"}j{h="1t["+8.I()+"]2Q 4N!"}o={t:$3.9.A.4M,h:h};$3.z.T(s,$3.9.q.x,o)}};k.p.4L=d(s,1x){7 o=5;7 b=8;7 h;7 26=$3.D.4K(1x);6(26!=5&&26.1c!=5){7 f=$3.D.2R(26.1c);6(f!=5){b.1K=f["1p"];7 3u=f["3v"];7 v="O://13.N.M/2T/4J";7 1i={2P:b.Q(),1p:b.1K,2O:"2N-2M",2L:1w((1U 1T).1S()/2K).12(),2J:1w(2I.2H()*2G).12(),2F:"1.0",4I:b.1b(),3v:3u};$3.Y.2E(b.m(),5,v,"2x",5,5,1i,b.Z(),b.2S,d(a){6(a!=5){6(a["t"]!=5){$3.z.T(s,$3.9.q.x,o)}j{7 K=$3.D.2C($3.D.1J(a["1I"]));6(a["2B"]===2A&&K==5){K=$3.D.2R($3.D.1J(a["1I"]));b.3g(s,K)}j{o={t:$3.9.A.S,1d:K};$3.z.T(s,$3.9.q.x,o)}}}j{h=5;6(8.V==="11-10"){h="分享平台["+b.I()+"]请求授权失败!"}j{h="1t ["+b.I()+"] 25 3t 3s!"}o={t:$3.9.A.S,h:h};$3.z.T(s,$3.9.q.x,o)}})}j{h=5;6(8.V==="11-10"){h="无效的授权回调:["+1x+"]"}j{h="2Q e v:["+1x+"]"}o={t:$3.9.A.3r,h:h};$3.z.T(s,$3.9.q.x,o)}}j{h=5;6(8.V==="11-10"){h="无效的授权回调:["+1x+"]"}j{h="2Q e v:["+1x+"]"}o={t:$3.9.A.3r,h:h};$3.z.T(s,$3.9.q.x,o)}};k.p.3e=d(1c,e){7 b=8;8.19(d(c){7 f={};6(1c!=5){6(1c.P!=5){f["1Z"]=1c.P}j 6(1c.I!=5){f["1C"]=1c.I}}j 6(c!=5&&c.E!=5&&c.E.P!=5){f["1Z"]=c.E.P}b.1f("O://13.N.M/1.1/1v/4H.1e","2x",f,5,d(B,a){7 r=a;6(B===$3.9.q.W){r={1F:$3.9.1j.k};b.1D(r,a);6(r["P"]===c["P"]){r["E"]=c["E"]}}6(e!=5){e(B,r)}})})};k.p.1f=d(v,3q,f,3p,e){7 o=5;7 b=8;8.19(d(c){6(c!=5){6(f==5){f={}}7 1i={};7 2D=5;6(c.E!=5){1i={2P:b.Q(),1p:c.E.1Y,2O:"2N-2M",2L:1w((1U 1T).1S()/2K).12(),2J:1w(2I.2H()*2G).12(),2F:"1.0"};2D=c.E.1X}$3.Y.2E(b.m(),5,v,3q,f,3p,1i,b.Z(),2D,d(a){6(a!=5){6(a["t"]!=5){6(e){e($3.9.q.x,a)}}j{7 K=$3.D.2C($3.D.1J(a["1I"]));6(a["2B"]===2A){6(e){e($3.9.q.W,K)}}j{7 2z=$3.9.A.S;3m(K["t"]){1H 4G:1H 4F:2z=$3.9.A.2t;2v}o={t:2z,1d:K};6(e){e($3.9.q.x,o)}}}}j{o={t:$3.9.A.S};6(e){e($3.9.q.x,o)}}})}j{7 h=5;6(8.V==="11-10"){h="尚未授权["+b.I()+"]用户"}j{h="3l 3k ["+b.I()+"]"}o={t:$3.9.A.2t,h:h};6(e){e($3.9.q.x,o)}}})};k.p.4E=d(){8.1W(5,5)};k.p.4D=d(s,c,e){7 f={};6(c["P"]!=5){f["1Z"]=c["P"]}j 6(c["2n"]!=5){f["1C"]=c["2n"]}7 b=8;8.1f("O://13.N.M/1.1/4C/4B.1e","1z",f,5,d(B,a){7 r=a;6(B===$3.9.q.W){r={1F:$3.9.1j.k};b.1D(r,a)}6(e!=5){e(B,r)}})};k.p.4A=d(2y,3o,e){7 b=8;8.19(d(c){7 f={};6(c!=5&&c["P"]!=5){f["c"]=c["P"]}f["2y"]=2y;f["4z"]=3o;b.1f("O://13.N.M/1.1/4y/4x.1e","2x",f,5,d(B,a){7 r=a;6(B===$3.9.q.W){r={};r["4w"]=a["4v"];r["2w"]=a["2w"];7 1v=[];7 24=a["1v"];6(24!=5){2a(7 i=0;i<24.18;i++){7 c={1F:$3.9.1j.k};b.1D(c,24[i]);1v.29(c)}}r["1v"]=1v;r["4u"]=a["2w"]>0}6(e!=5){e(B,r)}})})};k.p.2s=d(s,w,e){7 b=8;7 u=5;7 C=5;7 16=5;7 23=w!=5?w["@23"]:5;7 L={"@23":23};7 h;7 o;7 m=$3.9.J(8.m(),w,"m");6(m==5){m=$3.9.1a.3n}6(m===$3.9.1a.3n){m=8.35(w)}7 v=5;7 f=5;3m(m){1H $3.9.1a.34:{u=$3.9.J(8.m(),w,"u");6(u!=5){v="O://13.N.M/1.1/2h/2g.1e";f={1A:u};C=$3.9.J(8.m(),w,"C");16=$3.9.J(8.m(),w,"14");6(C!=5&&16!=5){f["C"]=C;f["14"]=16}}2v}1H $3.9.1a.33:{7 l=$3.9.J(8.m(),w,"l");6(l!=5){6(l.18>4){l.2k(4)}v="O://13.N.M/1.1/2h/2g.1e";f={l:l};u=$3.9.J(8.m(),w,"u");6(u!=5){f["1A"]=u}C=$3.9.J(8.m(),w,"C");16=$3.9.J(8.m(),w,"14");6(C!=5&&16!=5){f["C"]=C;f["14"]=16}}2v}1H $3.9.1a.32:{$3.Y.4t("M.3.4s.4r.N",d(a){6(a.1n){u=$3.9.J(b.m(),w,"u");7 2u=$3.9.J(b.m(),w,"2u");C=$3.9.J(b.m(),w,"C");16=$3.9.J(b.m(),w,"14");7 1u=$3.9.J(b.m(),w,"22");6(1u==5){1u=$3.9.J(b.m(),w,"v")}6(1u!=5&&u!=5){b.19(d(c){6(c!=5){$3.Y.4q(b.Q(),b.Z(),c.E.1Y,c.E.1X,s,1u,2u,d(a){6(a.t!=5){6(e){e($3.9.q.x,a)}}j{7 1o={4p:b.m(),u:u,22:1u,C:C,14:16};1M[s]={X:1o,1d:L};$3.z.1y(s,$3.9.q.4o,5,5,5)}})}j{h=5;6(8.V==="11-10"){h="尚未授权["+b.I()+"]用户"}j{h="3l 3k ["+b.I()+"]"}o={t:$3.9.A.2t,h:h};6(e){e($3.9.q.x,o)}}})}j{6(8.V==="11-10"){h="分享参数22 & u 不能为空!"}j{h="2s 4n 22 & u 4m 4l 4k 4j!"}o={t:$3.9.A.S,h:h};6(e!=5){e($3.9.q.x,o,5,L)}}}j{6(8.V==="11-10"){h="平台["+b.I()+"]需要依靠21.20进行分享,请先导入21.20后再试!"}j{h="1t ["+b.I()+"] 4i 4h 21.20,4g 4f 21.20 4e 4d 4c!"}o={t:$3.9.A.S,h:h};6(e!=5){e($3.9.q.x,o,5,L)}}});y}}6(v!=5&&f!=5){8.38(v,f,L,e)}j{h=5;6(8.V==="11-10"){h="不支持的分享类型["+m+"]"}j{h="4b 2s m ["+m+"]"}o={t:$3.9.A.4a,h:h};6(e!=5){e($3.9.q.x,o,5,L)}}};k.p.49=d(H){7 c={1F:8.m()};8.1D(c,H);y $3.D.2m(c)};k.p.2i=d(2q,e){6(8.2r()){7 b=8;8.19(d(c){$3.9.48(b.m(),c,2q,e)})}j{6(e){e({1n:2q})}}};k.p.47=d(c){y c.E!=5&&c.E.1Y!=5&&c.E.1X!=5};k.p.3j=d(){6(8.Q()!=5&&8.Z()!=5&&8.1b()!=5){y 3i}$3.z.46("[45-44] ["+8.I()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+8.I()+"]平台应用配置是否有误! "+"\\n配置:"+$3.D.2m(8.R));y 1E};k.p.3h=d(U){7 Q=$3.D.2p(U[F.1s]);7 Z=$3.D.2p(U[F.1r]);7 1b=$3.D.2p(U[F.1q]);6(Q!=5){U[F.1s]=Q}j{U[F.1s]=8.Q()}6(Z!=5){U[F.1r]=Z}j{U[F.1r]=8.Z()}6(1b!=5){U[F.1q]=1b}j{U[F.1q]=8.1b()}y U};k.p.3g=d(s,1G){7 b=8;7 E={P:1G["1Z"],1Y:1G["1p"],1X:1G["3f"],1N:1G,m:$3.9.43.42};7 c={1F:$3.9.1j.k,E:E};8.1W(c,d(){b.3e(5,d(B,a){6(B===$3.9.q.W){a["E"]=c["E"];c=a;b.1W(c,5)}$3.z.T(s,$3.9.q.W,c)})})};k.p.1W=d(c,e){8.1g=c;7 1h=8.2o();$3.Y.3d("3b",8.1g,1E,1h,d(a){6(e!=5){e()}})};k.p.19=d(e){6(8.1g!=5){6(e){e(8.1g)}}j{7 b=8;7 1h=8.2o();$3.Y.3c("3b",1E,1h,d(a){b.1g=a!=5?a.1V:5;6(e){e(b.1g)}})}};k.p.1D=d(c,H){6(c!=5&&H!=5){c["1N"]=H;c["P"]=H["2f"];c["2n"]=H["1C"];c["41"]=H["40"];c["3Z"]=2;6(H["1C"]!=5){c["v"]="O://N.M/"+H["1C"]}c["3Y"]=H["3X"];c["3W"]=H["3V"]?1:0;c["3U"]=H["3T"];c["3S"]=H["3R"];c["3Q"]=H["3P"];6(H["3a"]!=5){7 39=1U 1T(H["3a"]);c["3O"]=39.1S()}}};k.p.38=d(v,f,L,e){7 b=8;8.19(d(c){b.2i([f["1A"]],d(a){f["1A"]=a.1n[0];b.37(f,d(f){b.1f(v,"1z",f,5,d(B,a){7 r=a;6(B===$3.9.q.W){r={};r["1N"]=a;r["2Y"]=a["2f"];r["u"]=a["u"];6(a["1m"]!=5&&a["1m"]["1l"]!=5){7 17=a["1m"]["1l"];6(2e.p.12.2d(17)==="[2c 2b]"){7 l=[];2a(7 i=0;i<17.18;i++){7 1k=17[i];6(1k["m"]==="2X"){l.29(1k["2W"])}}r["l"]=l}}}6(e!=5){e(B,r,c,L)}})})})})};k.p.37=d(f,e){7 b=8;6(f["l"]!=5){8.1R(f["l"],0,d(l){b.1O(l,0,d(l){6(l.18>0){f["30"]=l.3N(",")}2V f["l"];f["l"]=5;6(e){e(f)}})})}j{6(e){e(f)}}};k.p.1R=d(l,G,e){7 b=8;6(G35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('g 1r={2r:"6k",2q:"6j",3Z:"6i",4v:"6h",40:"6g"};g 1y={2g:0,33:1,32:2};g 17={};h C(R){m.50=R;m.1z={};m.2d=d;m.2a=d;m.Y=$a.b.6f()}C.F.R=h(){Z m.50};C.F.19=h(){c(m.Y==="11-10"){Z"微信"}s{Z"C"}};C.F.J=h(){c(m.1z[1r.2r]!==3e){Z m.1z[1r.2r]}Z d};C.F.2Q=h(){c(m.1z[1r.40]!==3e){Z m.1z[1r.40]}Z 1g};C.F.2h=h(){c(m.1z[1r.2q]!==3e){Z m.1z[1r.2q]}Z d};C.F.3j=h(){Z"4Z-2v-"+$a.b.f.C+"-"+m.J()};C.F.3N=h(){c(m.1z[1r.3Z]!==3e){Z m.1z[1r.3Z]}Z $a.b.3N()};C.F.6e=h(2D){c(6d.29===0){Z m.1z}s{m.1z=m.4u(2D);m.2d=m.4w(2D);m.41(m.J())}};C.F.6c=h(){g q=m;g 2b="4Z-2v";$a.E.45("4Y",1g,2b,h(e){c(e!=d){g 2L=e.2D;c(2L==d){2L={}}2L["6b"+q.R()]=q.J();$a.E.48("4Y",2L,1g,2b,d)}})};C.F.6a=h(){Z 2p};C.F.4X=h(v,1h){c(m.4s()){g q=m;$a.E.4U(h(e){c(e.A){q.3B(h(22,1R){c(22){c(1h==d){1h={}}c(1h["26"]==d&&q.2d==d){1h["26"]=["69"]}$a.E.37("35",h(e){c(e.A){$a.E.2B("1Z.a.2A.2z.2j",h(e){c(e.A){q.4e(v,1R,1h)}s{q.3o(v,1R,1h)}})}s{q.3o(v,1R,1h)}})}s{g k=d;c(q.Y==="11-10"){k="尚未设置分享平台["+q.19()+"]的24 23:"+q.J()+",无法进行授权!请在项目设置中设置24 23后再试!"}s{k="68 67 4X 4T 18["+q.19()+"]4S 1a 3a 24 23:"+q.J()+"!4R 4Q 4P 4O 3a 24 23!"}g x={G:$a.b.Q.4N,k:k};$a.S.1A(v,$a.b.D.M,x)}})}s{g x={G:$a.b.Q.39,k:"应用已禁用后台模式,分享平台["+q.19()+"]无法进行授权! 请在项目设置中开启后台模式后再试!"};$a.S.1A(v,$a.b.D.M,x)}})}s{g k=d;c(m.Y==="11-10"){k="分享平台["+m.19()+"]应用信息无效!"}s{k="2v["+m.19()+"]3P 4M!"}g x={G:$a.b.Q.4L,k:k};$a.S.1A(v,$a.b.D.M,x)}};C.F.49=h(3d,o){g q=m;m.2c(h(I){g 1u={};c(3d!=d){c(3d.16!=d){1u["25"]=3d.16}}s c(I!=d&&I.15!=d&&I.15.16!=d){1u["25"]=I.15.1w["25"]}q.3S("2U://3K.1m.2T.1Z/3J/66","3I",1u,d,h(14,e){g V=e;c(14===$a.b.D.1Q){V={3m:$a.b.f.C};q.3i(V,e);c(V["16"]===I["16"]){V["15"]=I["15"]}}c(o!=d){o(14,V)}})})};C.F.65=h(){m.2E(d,d)};C.F.64=h(v,I,o){g k=d;c(m.Y==="11-10"){k="平台["+m.19()+"]不支持添加好友方法!"}s{k="2v["+m.19()+"]4W 1a 4V 63 62"}g x={G:$a.b.Q.39,k:k};c(o!=d){o($a.b.D.M,x)}};C.F.61=h(60,5Z,o){g k=d;c(m.Y==="11-10"){k="平台["+m.19()+"不支持获取好友列表方法!"}s{k="2v["+m.19()+"]4W 1a 4V 5Y 5X 5W"}g x={G:$a.b.Q.39,k:k};c(o!=d){o($a.b.D.M,x)}};C.F.1i=h(v,p,o){g q=m;g 3b=p!=d?p["@5V"]:1g;q.1Y(3b,v,p,o)};C.F.1Y=h(3b,v,p,o){g q=m;g 3c=p!=d?p["@3c"]:d;g B={"@3c":3c};c(3b){q.4K(v,p,B,o)}s{c(m.4r()){$a.E.4U(h(e){c(e.A){q.3B(h(22,1R){c(22){$a.E.37("35",h(e){c(e.A){$a.E.2B("1Z.a.2A.2z.2j",h(e){c(e.A){q.4p(v,p,B,o)}s{q.3u(v,p,B,o)}})}s{q.3u(v,p,B,o)}})}s{g k=d;c(m.Y==="11-10"){k="尚未设置分享平台["+q.19()+"]的24 23:"+q.J()+",无法进行分享!请在项目设置中设置24 23后再试!"}s{k="5U\'t 1i 4T 18["+q.19()+"]4S 1a 3a 24 23:"+q.J()+"!4R 4Q 4P 4O 3a 24 23!"}g x={G:$a.b.Q.4N,k:k};c(o!=d){o($a.b.D.M,x,d,B)}}})}s{g x={G:$a.b.Q.39,k:"应用已禁用后台模式,分享平台["+q.19()+"]无法进行分享! 请在项目设置中开启后台模式后再试!"};c(o!=d){o($a.b.D.M,x,d,B)}}})}s{g k=d;c(m.Y==="11-10"){k="分享平台["+m.19()+"]应用信息无效!"}s{k="2v["+m.19()+"]3P 4M!"}g x={G:$a.b.Q.4L,k:k};c(o!=d){o($a.b.D.M,x,d,B)}}}};C.F.4K=h(v,p,B,o){g H=p["3t"];c(H==d){H=1y.2g}g f=$a.b.f.3s;1L(H){O 1y.2g:f=$a.b.f.2o;N;O 1y.33:f=$a.b.f.2f;N;O 1y.32:f=$a.b.f.3r;N}g R=$a.b.w(f,p,"R");c(R==d){R=$a.b.T.2n}c(R===$a.b.T.2n){R=m.2P(p,f)}g q=m;g V;1L(R){O $a.b.T.2O:O $a.b.T.2N:O $a.b.T.2M:O $a.b.T.3q:O $a.b.T.3p:{q.1Y(1g,v,p,o);N}O $a.b.T.2w:{g z=$a.b.w(f,p,"z");c(1f.F.1e.1d(z)==="[1c 1b]"){c(z.29>9){z.29=9}s c(z.29===0){z=d}}c(z!=d){$a.E.3Y($a.b.T.2w,z,h(e){g 14=e.14;c(14!=d){V={18:f,H:H,z:z};V["z"]=z;q.38(14,v,V,B)}s{q.1Y(1g,v,p,o)}})}s{q.1Y(1g,v,p,o)}N}O $a.b.T.2x:{g r=$a.b.w(f,p,"r");c(r!=d){$a.E.3Y($a.b.T.2x,r,h(e){g 14=e.14;c(14!=d){V={18:f,H:H,r:r};V["1l"]=[r];q.38(14,v,V,B)}s{q.1Y(1g,v,p,o)}})}s{q.1Y(1g,v,p,o)}N}O $a.b.T.30:{g 1E=$a.b.w(f,p,"r");c(1E!=d){$a.E.3Y($a.b.T.30,1E,h(e){g 14=e.14;c(14!=d){V={18:f,H:H,2H:1E};q.38(14,v,V,B)}s{q.1Y(1g,v,p,o)}})}s{q.1Y(1g,v,p,o)}N}2e:{q.1Y(1g,v,p,o);N}}};C.F.38=h(14,v,p,B){g q=m;q.2c(h(I){c(14===$a.b.D.2s){$a.S.1X(v,$a.b.D.2s,d,I,B)}s{$a.S.1X(v,$a.b.D.1Q,p,I,B)}})};C.F.5T=h(v,1j,4G,4F){g q=m;c(1j.3W(m.J()+"://")===0){$a.E.37("35",h(e){c(e.A){$a.E.2B("1Z.a.2A.2z.2j",h(e){c(e.A){$a.E.5S(q.J(),v,1j,h(e){q.2F(v,e)})}s{q.3X(q.J(),v,1j)}})}s{q.3X(q.J(),v,1j)}});Z 2p}Z 1g};C.F.3X=h(J,v,1j){g q=m;c(1j.4D(0,"34".29)==="34"){c(1j.3W("://5R")!==-1){g 4J=3k 5Q("1N=(.+?)&");g 4I=4J.5P(1j)[1];g 4H={14:1,1N:4I};q.2F(v,4H)}s{$a.E.4E(J,v,1j,$a.b.f.C,h(e){c(e.A){c(e["2u"]["14"]&&e["2u"]["14"]==="4c"&&e["2u"]["A"]!==0){1L(4C(e["2u"]["A"])){O-2:{$a.S.1A(v,$a.b.D.2s,e)}N;2e:{$a.S.1A(v,$a.b.D.M,e)}N}}}})}}};C.F.5O=h(v,1j,4G,4F){g q=m;c(1j.3W(m.J()+"://")===0){$a.E.37("35",h(e){c(e.A){$a.E.2B("1Z.a.2A.2z.2j",h(e){c(e.A){$a.E.5N(q.J(),1j,h(e){q.2c(h(I){g P=17[v];g L=d;g B=d;c(P!=d){L=P["L"];B=P["X"]}1L(e.14){O $a.b.D.1Q:{g V={};V["1w"]=L;V["l"]=L["l"];g 1l=[];c(L["r"]){1l.2t(L["r"])}c(L["1F"]){1l.2t(L["1F"])}V["1l"]=1l;c(L["U"]!=d){V["z"]=[L["U"]]}s c(L["13"]!=d){V["z"]=[L["13"]]}$a.S.1X(v,$a.b.D.1Q,V,I,B);N}O $a.b.D.M:g x={G:$a.b.Q.12,X:{G:e.G}};$a.S.1X(v,$a.b.D.M,x,I,B);N;2e:$a.S.1X(v,$a.b.D.2s,d,I,B);N}5M 17[v];17[v]=d})})}s{q.3V(q.J(),v,1j)}})}s{q.3V(q.J(),v,1j)}});Z 2p}Z 1g};C.F.3V=h(J,v,1j){g q=m;g V;g x;g 1l;$a.E.4E(J,v,1j,$a.b.f.C,h(e){c(e.A){q.2c(h(I){g P=17[v];g L=d;g B=d;c(P!=d){L=P["L"];B=P["X"]}c(1j.4D(0,"34".29)==="34"){1L(4C(e["2u"]["A"])){O 0:{V={};V["1w"]=L;V["l"]=L["l"];1l=[];c(L["r"]){1l.2t(L["r"])}c(L["1F"]){1l.2t(L["1F"])}V["1l"]=1l;c(L["U"]!=d){V["z"]=[L["U"]]}s c(L["13"]!=d){V["z"]=[L["13"]]}$a.S.1X(v,$a.b.D.1Q,V,I,B)}N;O-2:{$a.S.1X(v,$a.b.D.2s,d,I,B)}N;O 1:{c(e["2u"]["20"]===7){V={};V["1w"]=L;V["l"]=L["l"];1l=[];c(L["r"]){1l.2t(L["r"])}c(L["1F"]){1l.2t(L["1F"])}V["1l"]=1l;c(L["U"]!=d){V["z"]=[L["U"]]}s c(L["13"]!=d){V["z"]=[L["13"]]}$a.S.1X(v,$a.b.D.1Q,V,I,B)}s{x={G:$a.b.Q.12,X:{G:e.G}};$a.S.1X(v,$a.b.D.M,x,I,B)}}N;2e:{x={G:$a.b.Q.12,X:{G:e.G}};$a.S.1X(v,$a.b.D.M,x,I,B)}N}}})}})};C.F.4z=h(I,o){g x=d;c(I!=d&&I.15.1w.2i!=d){g 4B=I.15.1w.2i;g 1u={3n:m.J(),4y:"2i",2i:4B};g 4A="2U://3K.1m.2T.1Z/3J/4x/2i";$a.E.3L($a.b.f.2o,d,4A,"3I",1u,d,h(e){c(e!=d){c(e["G"]!=d){c(o){o(e)}}s c(e["2K"]!=d&&e["2K"]===3H){g 1s=$a.1M.3G($a.1M.3F(e["3E"]));c(1s.2J==d){g 3U={};3U["3T"]=1s;c(o){o(3U)}}s{x={G:$a.b.Q.12,X:1s};c(o){o(x)}}}s{x={G:$a.b.Q.12,X:e};c(o){o(x)}}}s{x={G:$a.b.Q.12};c(o){o(x)}}})}};C.F.3S=h(r,3R,1u,3Q,o){g x=d;g q=m;m.2c(h(I){c(I!=d){c(1u==d){1u={}}c(I.15!=d){1u["2l"]=I.15.2R}$a.E.3L($a.b.f.2o,d,r,3R,1u,3Q,h(e){c(e!=d){c(e["G"]!=d){c(o){o($a.b.D.M,e)}}s{g 1s=$a.1M.3G($a.1M.3F(e["3E"]));c(e["2K"]===3H&&1s["2J"]==d){c(o){o($a.b.D.1Q,1s)}}s{c(1s.2J===5L){q.4z(I,h(e){c(e.3T!=d){g 1W=e.3T;g 16=d;c(q.2Q()){16=1W["3h"]}c(16==d){16=1W["25"]}I.15["16"]=16;I.15["2R"]=1W["2l"];I.15["3l"]=1W["2S"];I.15.1w["2l"]=1W["2l"];I.15.1w["2S"]=1W["2S"];I.15.1w["25"]=1W["25"];I.15.1w["2i"]=1W["2i"];I.15.1w["1I"]=1W["1I"];q.2E(I,h(){q.3S(r,3R,1u,3Q,o)})}s{g 1N=$a.b.Q.3O;x={G:1N,X:1s};c(o){o($a.b.D.M,x)}}})}s{g 1N=$a.b.Q.12;1L(1s.2J){O 5K:O 5J:O 5I:O 5H:O 5G:O 5F:1N=$a.b.Q.3O;N}x={G:1N,X:1s};c(o){o($a.b.D.M,x)}}}}}s{x={G:$a.b.Q.12};c(o){o($a.b.D.M,x)}}})}s{g k=d;c(m.Y==="11-10"){k="尚未授权["+q.19()+"]用户"}s{k="3P 5E ["+q.19()+"]"}x={G:$a.b.Q.3O,k:k};c(o){o($a.b.D.M,x)}}})};C.F.5D=h(1G){g I={3m:m.R()};m.3i(I,1G);Z $a.1M.3C(I)};C.F.5C=h(v,e){m.2F(v,e)};C.F.1k=h(f,3M,o){c(m.3N()){m.2c(h(I){$a.b.5B(f,I,3M,o)})}s{c(o){o({A:3M})}}};C.F.2F=h(v,e){c(e.14==d){Z}g q=m;g x;1L(e.14){O $a.b.D.1Q:{g 1N=e.1N;g 1u={3n:q.J(),5A:q.2h(),1N:1N,4y:"5z"};$a.E.3L($a.b.f.2o,d,"2U://3K.1m.2T.1Z/3J/4x/2l","3I",1u,d,h(e){c(e!=d){c(e["G"]!=d){$a.S.1A(v,$a.b.D.M,e)}s c(e["2K"]!=d&&e["2K"]===3H){g 1s=$a.1M.3G($a.1M.3F(e["3E"]));c(1s.2J==d){q.4a(v,1s)}s{x={G:$a.b.Q.12,X:1s};$a.S.1A(v,$a.b.D.M,x)}}s{x={G:$a.b.Q.12,X:e};$a.S.1A(v,$a.b.D.M,x)}}s{x={G:$a.b.Q.12};$a.S.1A(v,$a.b.D.M,x)}});N}O $a.b.D.M:{c(e.G!=d){x={G:e.G,X:e}}s{x={G:$a.b.Q.12,X:{G:e.G}}}$a.S.1A(v,$a.b.D.M,x);N}2e:$a.S.5y(v);$a.S.1A(v,$a.b.D.2s,d);N}};C.F.4w=h(1V){Z 1V[1r.4v]};C.F.4u=h(1V){g 3D=$a.1M.4t(1V[1r.2r]);g 2h=$a.1M.4t(1V[1r.2q]);c(3D!=d){1V[1r.2r]=3D}s{1V[1r.2r]=m.J()}c(2h!=d){1V[1r.2q]=2h}s{1V[1r.2q]=m.2h()}Z 1V};C.F.4s=h(){c(m.J()!=d&&m.2h()!=d){Z 2p}$a.S.3x("[3w-3v] ["+m.19()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+m.19()+"]平台应用配置是否有误! "+"\\n配置:"+$a.1M.3C(m.1z));Z 1g};C.F.4r=h(){c(m.J()!=d){Z 2p}$a.S.3x("[3w-3v] ["+m.19()+"]应用信息有误,不能进行相关操作。请检查本地代码中和服务端的["+m.19()+"]平台应用配置是否有误! "+"\\n配置:"+$a.1M.3C(m.1z));Z 1g};C.F.3B=h(o){g q=m;$a.E.5x(h(e){g 1R=d;g 22=1g;c(e!=d&&e.3A!=d){4q(g i=0;i(3k 47).46()};C.F.2c=h(o){c(m.2a!=d){c(o){o(m.2a)}}s{g q=m;g 2b=m.3j();$a.E.45("44",1g,2b,h(e){q.2a=e!=d?e.2D:d;c(o){o(q.2a)}})}};C.F.3i=h(I,1G){c(I!=d&&1G!=d){g q=m;I["1w"]=1G;g 16=d;c(q.2Q()){16=1G["3h"]}c(16==d){16=1G["25"]}I["16"]=16;I["43"]=1G["43"];I["54"]=1G["53"];g 2C=2;c(1G["42"]===1){2C=0}s c(1G["42"]===2){2C=1}I["2C"]=2C}};C.F.41=h(3g){c(3g!=d){$a.E.2B("1Z.a.2A.2z.2j",h(e){c(e.A){$a.S.52(3g)}})}};C.F.2P=h(p,f){g R=$a.b.T.2O;g u=$a.b.w(f,p,"U");g r=$a.b.w(f,p,"r");g z=$a.b.w(f,p,"z");g 1O=$a.b.w(f,p,"3f");g 1P=$a.b.w(f,p,"2y");g 1v=$a.b.w(f,p,"1F");c((u!=d||1f.F.1e.1d(z)==="[1c 1b]")&&r!=d){c(1P!=d){R=$a.b.T.2N}s c(1v!=d){R=$a.b.T.2M}s{R=$a.b.T.2x}}s c(1f.F.1e.1d(z)==="[1c 1b]"||1O!=d){R=$a.b.T.2w}Z R};$a.b.51($a.b.f.C,C);',62,393,'||||||||||mob|shareSDK|if|null|data|platformType|var|function|||error_message|text|this||callback|parameters|self|url|else||thumbImage|sessionId|getShareParam|error|title|images|result|userData|WeChat|responseState|ext|prototype|error_code|scene|user|appID|shareParameter|content|Fail|break|case|shareParams|errorCode|type|native|contentType|thumb_image|resultData|urlstring|user_data|_currentLanguage|return|Hans|zh|APIRequestFail|image|state|credential|uid|WeChatShareContentSet|platform|name|not|Array|object|apply|toString|Object|false|settings|share|callbackUrl|_convertUrl|urls|weixin|be|can|userName|param|WeChatAppInfoKeys|response|nil|params|musicUrl|raw_data|webpageUrl|WeChatScene|_appInfo|ssdk_authStateChanged|canOpenURL|or|returnData|sourceFile|audio_url|rawData|openURL|scope|app|path|switch|utils|code|emoticonData|extInfo|Success|urlScheme|sendreq|ssdk_setDataToPasteboard|thumbData|appInfo|cred|ssdk_shareStateChanged|_checkShare|com|objectType|fileExtension|hasReady|Scheme|URL|openid|scopes|ssdk_getImageData|fileData|length|_currentUser|domain|_getCurrentUser|_authScopes|default|WeChatTimeline|Session|appSecret|refresh_token|wechat|credentialRawData|access_token|description|Auto|WeChatSession|true|AppSecret|AppId|Cancel|push|retDic|Platform|Image|WebPage|ext_info|connector|sharesdk|isPluginRegisted|gender|value|_setCurrentUser|_authHandler|mediaUrl|source_file|typeObj|errcode|status_code|curApps|Audio|App|Text|_getShareType|backUnionid|token|expires_in|qq|https|scopesStr|UnsupportContentType|sourceFileData|sourceFileExtension|source_extension|File|emoticon|Fav|Timeline|wx|WXApi||ssdk_isConnectedPlatformSDK|_extensionShareFinish|UnsupportFeature|set|enableExtensionShare|flags|query|undefined|emoticon_data|appId|unionid|_updateUserInfo|cacheDomain|new|expired|platform_type|appid|_ssoAuthorizeWithoutSDK|MiniProgram|Video|WeChatFav|Unknown|wechat_scene|_shareWithoutSDK|WARNING|ShareSDK|log|schema|CFBundleURLSchemes|CFBundleURLTypes|_checkUrlScheme|objectToJsonString|appKey|response_data|base64Decode|jsonStringToObject|200|GET|sns|api|ssdk_callHTTPApi|contents|convertUrlEnabled|UserUnauth|Invalid|headers|method|callApi|newCredential|res|_handleShareCallbackWithoutSDK|indexOf|_handleSSOCallbackWithoutSDK|ssdk_wechatExtensionShare|ConvertUrl|BackUnionid|_setupApp|sex|nickname|currentUser|getCacheData|getTime|Date|setCacheData|getUserInfo|_succeedAuthorize|authUrl|Weixinauth|split|_ssoAuthorize|unsupported|wxmp_path|wxmp_user_name|Share|file|sharing|unsupport|file_data|emoData|command|_share|for|_canShare|_canAuthorize|trim|_checkAppInfoAvailable|Scopes|_checkAuthScopes|oauth2|grant_type|_refreshAccessToken|refreshTokenUrl|refreshToken|parseInt|slice|ssdk_getDataFromPasteboard|annotation|sourceApplication|callbackData|codeString|regex|_extensionShare|InvaildPlatform|configuration|UnsetURLScheme|after|again|try|Please|did|because|isMultitaskingSupported|support|do|authorize|currentApp|SSDK|_type|registerPlatformClass|ssdk_plugin_wechat_setup|headimgurl|icon|_isUserAvaliable|OAuth2|credentialType|1e3|ssdk_openAuthUrl|1926559385|mobilecheck|connect|open|auth|ssdk_wechatAuth|appBrandUserName|appBrandPath|fileExt|mediaDataUrl|1020|1010|sdkver|String|returnFromApp|ssdk_wechatShareMiniProgram|ssdk_wechatShareFile|ssdk_wechatShareVideo|ssdk_wechatShareAudio|ssdk_wechatShareApp|ssdk_wechatShareWebpage|ssdk_wechatShareImage|ssdk_wechatShareText|getAppConfig|ssdk_plugin_wechat_cancel_auth|authorization_code|secret|convertUrl|authStateChanged|createUserByRawData|Authorization|42003|41008|41001|40029|40014|40001|42001|delete|ssdk_wechatHandleShareCalback|handleShareCallback|exec|RegExp|oauth|ssdk_wechatHandleSSOCalback|handleSSOCallback|Can|extension_share|list|friend|getting|size|cursor|getFriends|friends|adding|addFriend|cancelAuthorize|userinfo|to|Unable|snsapi_userinfo|isSupportAuth|plat_|saveConfig|arguments|setAppInfo|preferredLanguageLocalize|back_unionid|auth_scopes|covert_url|app_secret|app_id'.split('|'),0,{})) ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/en.lproj/ShareSDK.strings ================================================ /* ShareSDKLocalizable.strings AppgoFramework Created by ShareSDK.cn on 13-1-14. 官网地址:http://www.ShareSDK.cn 技术支持邮箱:support@sharesdk.cn 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 商务QQ:4006852216 Copyright (c) 2013年 ShareSDK.cn. All rights reserved. */ "AUTH_VIEW_TITLE" = "Authorize"; "AUTH_VIEW_CANCEL_BUTTON" = "Cancel"; "AUTH_VIEW_SIGN_IN" = "Sign In"; "AUTH_VIEW_ACCOUNT" = "Account(e.g. name@example.com)"; "AUTH_VIEW_PASS" = "Password"; "AUTH_VIEW_ALERT_TITLE" = "Tips"; "AUTH_VIEW_ALERT_CANCEL_BUTTON" = "I known"; "AUTH_VIEW_INPUT_ACCOUNT" = "Input your account"; "AUTH_VIEW_INPUT_PASSWORD" = "Input your password"; "AUTH_VIEW_UNAUTHORIZED" = "Account or password is not correct"; "SHARE_VIEW_DONE" = "Done"; "SHARE_VIEW_TITLE" = "Share"; "SMS_NEXT_TEXT" = "Next"; "SMS_REGION_TEXT" = "Region"; "SMS_PHONENUM_PLACEHOLDER_TEXT" = "Mobile number"; "SMS_LOGIN_TITLE" = "Please enter your phone number"; "SMS_DEF_COUNTRY" = "China"; "SMS_CHOOSE_COUNTRY_TEXT" = "Choose the country"; "SMS_CHECK_PHONENUM_TEXT" = "Phone Number Confirmation"; "SMS_SURE_TEXT" = "OK"; "SMS_CHECK_TEXT" = "I see"; "SMS_WILL_SEND_TEXT" = "We will send a verify code to the following number"; "SMS_PHONENUM_ERROR_TEXT" = "Phone number format error"; "SMS_PHONENUM_ERROR_MESSAGE" = "Phone number is invalid"; "SMS_DONE_TEXT" = "Done"; "SMS_CHECK_CODE_TITLE" = "The verify code has been sent"; "SMS_PHONE_TEXT" = "Mobile"; "SMS_CHECKCODE_PLACEHOLDER_TEXT" = "Verify code"; "SMS_RESEND_TEXT" = "Resend"; "SMS_BACK_TEXT" = "Back"; "SMS_WAIT_TEXT" = "Wait"; "SMS_TITLE" = "SMS Login"; "SMS_CODE_TEXT" = "Code" "SMS_BACK_MESSAGE" = "SMS verify code may be slightly delayed"; "SMS_VIOICE_MESSAGE" = "Not receive code? Please try"; "SMS_VIOICE_TEXT" = "Voice code"; "SMS_VOICE_MESSAGE" = "We will inform you the phone verify code"; "SMS_Error_100" = "System is a little problem, Please try again later"; "SMS_Error_101" = "No permission request"; "SMS_Error_102" = "Failed to decrypt msg"; "SMS_Error_103" = "Request parameter missing"; "SMS_Error_104" = "Request parameter illegal"; "SMS_Error_105" = "Verify code error"; "SMS_Error_106" = "Send code fail"; "SMS_Error_107" = "Phone No. over send code limit, Please try again tomorrow"; "SMS_Error_108" = "App over send code limit"; "SMS_Error_109" = "System is a little problem, Please try again later"; "ShareSDK_Error_WechatMini" = "MiniProgram only support WeChat friends to share"; "ShareSDK_Error_WechatFile" = "WeChat Timeline does not support file sharing"; "ShareSDK_Error_Register" = "activePlatforms type error"; "ShareSDK_Error_NORegister" = "ShareSDK has not been initialized yet"; "ShareSDK_Error_Illegal" = "Illegal operation"; "ShareSDKConfigFile_Error_Illegal" = "Invalid shared content"; "ShareSDKConfigFile_Error_NOContentName" = "Node without contentName"; "ShareSDKConfigFile_Error_NOXMLFile" = "The ShareContent.xml file was not found"; "ShareSDKConfigFile_Error_XML" = "ShareContent.xml does not find the valid child node or xml format is incorrect"; "ShareSDKConfigFile_Error_MOBAppKey" = "Please fill in the correct MOBAppKey in info.plist"; "ShareSDKExtension_Error_Platforms"= "Did not specify which platforms to share and can not share"; "ShareSDKExtension_Error_Platform" = "Can not be shared to the specified platform, the platform does not support onekey share"; "ShareSDKExtension_Error_NOAuthorize" = "User is not authorized yet"; "ShareSDKExtension_Error_ClientInstalled" = "Does not support detection clients"; "ShareSDKConnector_Error_CLose" = "Active off"; "ShareSDKConnector_Error_Data" = "Data error"; "ShareSDKConnector_Error_Video" = "Not find video"; "ShareSDKConnector_Error_Audio" = "Not find audio"; "ShareSDKConnector_Error_Read_Data" = "Data parsing error"; "ShareSDKConnector_Error_File" = "Not find resources"; "ShareSDKConnector_Error_NetVideo" = "No support for online video"; "ShareSDKConnector_Error_DownLoadPhoto" = "Network image download failed"; "ShareSDKConnector_Error_Twitter_Size" = "File size should not exceed 512 MB"; "ShareSDKConnector_Error_Twitter_Time" = "Duration should be between 0.5 seconds and 140.0 seconds"; "ShareSDKConnector_Error_WeChat_NoLib" = "Please add libWeChat.a into the project and import WXApi.h" "ShareSDKConnector_Error_WeChat_NOShare" = "Share platform [WeChat] client does not support sharing"; "ShareSDKConnector_Error_WeChat_NOClient" = "Share the platform [WeChat] has not yet installed the client! Can not share"; "ShareSDKConnector_Error_WeChat_NOLibShare" = "Share platform [WeChat] has not yet add libWeChatSDK.a! Unable to do so"; "ShareSDKConnector_Error_Facebook_NOAppkey" = "AppKey is not configured"; "ShareSDKConnector_Error_Facebook_ShareType" = "The sharing status is unknown"; "ShareSDKConnector_Error_Facebook_DisplayName" = "Share platform[Facebook]Be sure to configure displayName when sharing the client"; "ShareSDKConnector_Error_Facebook_NOClient" = "Share the platform [Facebook] has not yet installed the client! Can not share"; "ShareSDKConnector_Error_FacebookMessager_NOClient" = "Share platform [Facebook Messenger] has not yet installed the client! Can not share"; "ShareSDKConnector_Error_FacebookMessager_NOLibShare" = "Share platform [Facebook Messenger] has not yet add FBSDKMessengerShareKit.framework! Can not share"; "ShareSDKConnector_Error_MeiPai_NOLib" = "Please add the MPShareSDK.framework into the project"; "ShareSDKConnector_Error_MeiPai_NOLibShare" = "Share platform[MeiPai]has not yet add MPShareSDK.framework! Unable to do so"; "ShareSDKConnector_Error_MeiPai_NOShare" = "Share platform[MeiPai]does not support such sharing" "ShareSDKConnector_Error_MeiPai_NOShareVideo" = "Share platform [MeiPai] client version does not support video sharing"; "ShareSDKConnector_Error_MeiPai_NOSharePhoto" = "Share platform [MeiPai] client version does not support photo sharing"; "ShareSDKConnector_Error_MeiPai_NOClient" = "Share platform [MeiPai] has not yet installed the client! Can not share"; "ShareSDKConnector_Error_MeiPai_PhotoLibraryUsageDescription" = "Unconfigured album permissions NSPhotoLibraryUsageDescription can not determine the type of incoming album resource is shared using image type sharing"; "ShareSDKConnector_Error_DingTalk_NOLib" = "Please add the DTShareKit.framework into the project"; "ShareSDKConnector_Error_DingTalk_NOLibShare" = "Share platform[DingTalk]has not yet add DTShareKit.framework! Unable to do so"; "ShareSDKConnector_Error_DingTalk_NOClient" = "Share platform [DingTalk] has not yet installed the client! Can not share"; "ShareSDKConnector_Error_DingTalk_NOShare" = "Share platform [DingTalk] client version does not support sharing"; "ShareSDKConnector_Error_Yixin_NOLib" = "Please add libYixinSDK.a into the project and import YXApi.h"; "ShareSDKConnector_Error_Yixin_Auth" = "[Yixin] Authorization failed"; "ShareSDKConnector_Error_Yixin_SSO" = "[Yixin] The client does not support SSO authorization"; "ShareSDKConnector_Error_Yixin_NOLibShare" = "Share platform[Yixin]has not yet add YXApi.a! Unable to do so"; "ShareSDKConnector_Error_Yixin_NOShare" = "Share platform[Yixin]client version does not support sharing"; "ShareSDKConnector_Error_Yixin_NOClient" = "Share platform[Yixin]has not yet installed the client! Can not share"; "ShareSDKConnector_Error_KaKao_NOLib" = "Please add KakaoOpenAPI.framework into the project and import KOSession.h" "ShareSDKConnector_Error_KaKao_NOLibShare" = "Share platform[KaKao]has not yet add KakaoOpenSDK.framework! Unable to do so"; "ShareSDKConnector_Error_KaKao_Callback" = "Invalid callback request"; "ShareSDKConnector_Error_KaKao_ShareTalk" = "[Kakao] Talk client sharing failed, please check sharing parameters"; "ShareSDKConnector_Error_KaKao_Talk" = "Share platform [KaKao] does not support Talk client sharing"; "ShareSDKConnector_Error_KaKao_Story" = "Share platform [KaKao] does not support Story client sharing"; "ShareSDKConnector_Error_AliPay_NOLib" = "Please add libAPOpenSdk.a into the project and import APOpenAPI.h"; "ShareSDKConnector_Error_AliPay_NOShare" = "Share platform[AliPay]client version does not support sharing"; "ShareSDKConnector_Error_AliPay_NOClient" = "Share platform[AliPay]has not yet installed the client! Can not share"; "ShareSDKConnector_Error_AliPay_NOLibShare" = "Share platform[AliPay]has not yet add libAPOpenSdk.a! Unable to do so"; "ShareSDKConnector_Error_Line_NOLib" = "Please add LineSDK.framework into the project"; "ShareSDKConnector_Error_Line_NOLibShare" = "Share platform[Line]has not yet add LineSDK.framework! Unable to do so"; "ShareSDKConnector_Error_Instagram_PhotoLibrary" = "Not authorized to access the album and can not share it"; "ShareSDKConnector_Error_Mail" = "The device does not support sending mail"; "ShareSDKConnector_Error_RenRen_NOLib" = "Please add RennSDK.framework into the project"; "ShareSDKConnector_Error_RenRen_NOLibShare" = "Share platform[RenRen]has not yet add RennSDK.framework! Unable to do so"; "ShareSDKConnector_Error_RenRen_Auth" = "Share platform [RenRen] authorization call failed"; "ShareSDKConnector_Error_QQ_NOLib" = "Please add TencentOpenAPI.framework into the project"; "ShareSDKConnector_Error_QQ_NOLibShare" = "Share platform[QQ]has not yet add TencentOpenApi.framework! Unable to do so"; "ShareSDKConnector_Error_QQ_NOClient" = "Share platform[QQ]has not yet installed the client! Can not share"; "ShareSDKConnector_Error_QQ_Share" = "Share platform [QQ] sharing failed"; "ShareSDKConnector_Error_QQ_Version" = "The current version of the QQ is too low, need to be updated to a new version can support"; "ShareSDKConnector_Error_QQ_QZone" = "Sharing platform [QQ] call to share the failure of the current QQSDK does not support QZONE text sharing"; "ShareSDKConnector_Error_QQ_ShareScene" = "Unrecognized sharing scenes"; "ShareSDKConnector_Error_QQ_Auth" = "Share platform [QQ] authorization call failed"; "ShareSDKConnector_Error_QQ_ShareType" = "Does not support this type of sharing"; "ShareSDKConnector_Error_Weibo_NOLibShare" = "Share platform[Weibo]has not yet add libWeiboSDK.a! Unable to do so"; "ShareSDKConnector_Error_Weibo_Auth" = "Share platform [Weibo] authorization call failed"; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/en.lproj/country.plist ================================================ A Angola+244 Afghanistan+93 Albania+355 Algeria+213 Andorra+376 Aruba+297 Anguilla+1264 Antigua and Barbuda+1268 Argentina+54 Armenia+374 Australia+61 Austria+43 Azerbaijan+994 B Bahamas+1242 Bahrain+973 Bosnia and Herzegovina+387 Barbados+1246 Bhutan+975 Belarus+375 Belgium+32 Belize+501 Benin+229 Bermuda Is.+1441 Bolivia+591 Botswana+267 Brazil+55 Brunei+673 Bulgaria+359 Burkina-faso+226 Burundi+257 Burma+95 Bangladesh+880 C Czech Republic+420 Canada+1 Cape Verde+238 Comoros+269 Cuba+53 Costa Rica+506 Colombia+57 Cayman Is+1345 Croatia+385 Cook Is+682 Cameroon+237 Cyprus+357 Central African Republic+236 Chad+235 Chile+56 China+86 D Djibouti+253 Denmark+45 Dominica+1767 Democratic Republic of the Congo+243 Dominican Republic+1809 Djibouti+253 E Estonia+372 East Timor+670 Egypt+20 Equatorial Guinea+240 England+44 Ecuador+593 F Fiji+679 Finland+358 Faroe Islands+298 France+33 French Guiana+594 French Polynesia+689 G Germany+49 Gambia+220 Georgia+995 Grenada+1473 Greenland+299 Guadeloupe+590 Guam+1671 Guyana+592 Gabon+241 Ghana+233 Guinea+224 Guinea-Bissau+245 Guatemala+502 Greece+30 Gibraltar+350 H Haiti+509 Honduras+504 Hongkong+852 Hungary+36 I Iceland+354 Ireland+353 Ivory Coast+225 India+91 Indonesia+62 Iran+98 Iraq+964 Israel+972 Italy+39 J Japan+81 Jamaica+1876 Jordan+962 K Kampuchea+855 Kyrgyzstan+996 Korea+82 Kazakstan+7 Kiribati+686 Kenya+254 Kuwait+965 L Laos+856 Latvia+371 Lebanon+961 Lesotho+266 Liberia+231 Libya+218 Liechtenstein+423 Lithuania+370 Luxembourg+352 M Macao+853 Madagascar+261 Malawi+265 Malaysia+60 Maldives+960 Macedonia+389 Mayotte+269 Micronesia+691 Mauritania+222 Mali+223 Malta+356 Martinique+596 Mauritius+230 Mexico+52 Moldova+373 Monaco+377 Mongolia+976 Montenegro+382 Montserrat Is+1664 Morocco+212 Mozambique+258 N Netherlands+31 Netheriands Antilles+599 Namibia+264 Nepal+977 Nicaragua+505 Niger+227 Nigeria+234 Norway+47 New Zealand+64 New Caledonia+687 O Oman+968 P Philippines+63 Puerto Rico+1787 Poland+48 Paraguay+595 Papua New Cuinea+675 Panama+507 Pakistan+92 Palestinian Territory+970 Palau+680 Portugal+351 Peru+51 Q Qatar+974 R Russia+7 Réunion Island+262 Republic Of The Congo+242 Rwanda+250 Romania+40 S Sweden+46 Switzerland+41 South Africa+27 Salvador+503 Saint Lucia+1758 Saint Vincent and The Grenadines+1784 Sao Tome and Principe+239 Saint Kitts and Nevis+1869 Serbia+381 South Sudan+211 Saudi Arabia+966 Senegal+221 Seychelles+248 Sierra Leone+232 Slovakia+421 Slovenia+386 Solomon Is+677 Somali+252 Sri Lanka+94 Sudan+249 Suriname+597 Swaziland+268 Samoa+685 Singapore+65 Spain+34 Syria+963 T Togo+228 Taiwan+886 Tajikstan+992 Tanzania+255 Thailand+66 Tonga+676 Trinidad and Tobago+1868 Turks and Caicos Islands+1649 Tunisia+216 Turkey+90 Turkmenistan+993 U United Arab Emirates+971 United States of America+1 Uganda+256 Ukraine+380 Uruguay+598 Uzbekistan+998 United Kingdom+44 V Venezuela+58 Vietnam+84 Vanuatu+678 Virgin Islands, British+1340 Virgin Islands, US+1284 Y Yemen+967 Z Zimbabwe+263 Zambia+260 ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/zh-Hans.lproj/ShareSDK.strings ================================================ /* ShareSDKLocalizable.strings AppgoFramework Created by ShareSDK.cn on 13-1-14. 官网地址:http://www.mob.com 技术支持邮箱:support@sharesdk.cn 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复) 商务QQ:4006852216 Copyright (c) 2013年 ShareSDK.cn. All rights reserved. */ "AUTH_VIEW_TITLE" = "用户授权"; "AUTH_VIEW_CANCEL_BUTTON" = "取消"; "AUTH_VIEW_SIGN_IN" = "登录"; "AUTH_VIEW_ACCOUNT" = "帐号,如name@example.com"; "AUTH_VIEW_PASS" = "密码"; "AUTH_VIEW_ALERT_TITLE" = "提示"; "AUTH_VIEW_ALERT_CANCEL_BUTTON" = "知道了"; "AUTH_VIEW_INPUT_ACCOUNT" = "请输入登录帐号!"; "AUTH_VIEW_INPUT_PASSWORD" = "请输入登录密码!"; "AUTH_VIEW_UNAUTHORIZED" = "用户名或密码错误"; "SHARE_VIEW_DONE" = "完成"; "SHARE_VIEW_TITLE" = "分享"; "SMS_NEXT_TEXT" = "下一步"; "SMS_REGION_TEXT" = "国家/地区"; "SMS_PHONENUM_PLACEHOLDER_TEXT" = "请输入手机号码"; "SMS_LOGIN_TITLE" = "请输入您的手机号"; "SMS_DEF_COUNTRY" = "中国"; "SMS_CHOOSE_COUNTRY_TEXT" = "选择国家或地区"; "SMS_CHECK_PHONENUM_TEXT" = "确认手机号码"; "SMS_SURE_TEXT" = "好"; "SMS_CHECK_TEXT" = "我知道了"; "SMS_WILL_SEND_TEXT" = "我们将发送验证码短信到这个号码"; "SMS_PHONENUM_ERROR_TEXT" = "手机号码格式错误"; "SMS_PHONENUM_ERROR_MESSAGE" = "\n您输入的是一个无效手机号码\n请重新输入"; "SMS_DONE_TEXT" = "提交"; "SMS_CHECK_CODE_TITLE" = "验证码已发送,请填写验证码"; "SMS_PHONE_TEXT" = "手机号码"; "SMS_CHECKCODE_PLACEHOLDER_TEXT" = "请输入您的短信验证码"; "SMS_RESEND_TEXT" = "重新发送"; "SMS_BACK_TEXT" = "返回"; "SMS_WAIT_TEXT" = "等待"; "SMS_TITLE" = "短信登录"; "SMS_CODE_TEXT" = "验证码" "SMS_BACK_MESSAGE" = "验证码短信可能略有延迟,确定返回并重新开始?"; "SMS_VIOICE_MESSAGE" = "短信验证码收不到?请尝试"; "SMS_VIOICE_TEXT" = "语音验证码"; "SMS_VOICE_MESSAGE" = "我们将以电话的方式告知你验证码,请注意接听"; "SMS_Error_100" = "系统有点小问题,请稍后再试"; "SMS_Error_101" = "权限错误"; "SMS_Error_102" = "解密数据失败"; "SMS_Error_103" = "缺少必要参数"; "SMS_Error_104" = "请求数据非法"; "SMS_Error_105" = "验证码错误"; "SMS_Error_106" = "请求发送验证码失败"; "SMS_Error_107" = "该号码超过接受验证码上限次数,请明天再试"; "SMS_Error_108" = "该应用超过发送验证码上限次数"; "SMS_Error_109" = "发送验证码太频繁,请稍后再试"; "ShareSDK_Error_WechatMini" = "小程序分享只支持微信好友分享"; "ShareSDK_Error_WechatFile" = "微信朋友圈不支持文件分享"; "ShareSDK_Error_Register" = "传入参数 activePlatforms 类型错误"; "ShareSDK_Error_NORegister" = "尚未初始化SDK"; "ShareSDK_Error_Illegal" = "非法操作"; "ShareSDKConfigFile_Error_Illegal" = "无效的分享内容"; "ShareSDKConfigFile_Error_NOContentName" = "没有找到contentName节点"; "ShareSDKConfigFile_Error_NOXMLFile" = "没有找到ShareContent.xml文件"; "ShareSDKConfigFile_Error_XML" = "ShareContent.xml 没有寻找到有效子节点或xml格式不正确"; "ShareSDKConfigFile_Error_MOBAppKey" = "请在info.plist中填写正确的 MOBAppKey"; "ShareSDKExtension_Error_Platforms"= "没有指定要分享到哪些平台,无法进行分享"; "ShareSDKExtension_Error_Platform" = "无法分享到指定平台,该平台不支持一键分享操作"; "ShareSDKExtension_Error_NOAuthorize" = "用户尚未授权"; "ShareSDKExtension_Error_ClientInstalled" = "平台不支持检测客户端功能"; "ShareSDKConnector_Error_NetVideo" = "暂不支持网络视频"; "ShareSDKConnector_Error_DownLoadPhoto" = "网络图片下载失败"; "ShareSDKConnector_Error_CLose" = "主动关闭"; "ShareSDKConnector_Error_Data" = "数据不完整"; "ShareSDKConnector_Error_Video" = "未找到指定视频数据"; "ShareSDKConnector_Error_Audio" = "未找到指定音频数据"; "ShareSDKConnector_Error_Read_Data" = "数据解析错误"; "ShareSDKConnector_Error_File" = "未找到指定资源"; "ShareSDKConnector_Error_Twitter_Size" = "视频数据超过最大上传限制512M"; "ShareSDKConnector_Error_Twitter_Time" = "视频播放时间需要控制在 0.5 - 140.0 秒之间"; "ShareSDKConnector_Error_WeChat_NoLib" = "请将libWeChat.a导入项目并引入WXApi.h" "ShareSDKConnector_Error_WeChat_NOShare" = "分享平台[微信]客户端不支持分享功能"; "ShareSDKConnector_Error_WeChat_NOClient" = "分享平台[微信]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_WeChat_NOLibShare" = "分享平台[微信]尚未导入libWeChatSDK.a库!无法进行相关操作"; "ShareSDKConnector_Error_Facebook_NOAppkey" = "appKey 未配置"; "ShareSDKConnector_Error_Facebook_ShareType" = "分享状态未知"; "ShareSDKConnector_Error_Facebook_DisplayName" = "分享平台[Facebook]进行客户端分享时请务必配置displayName"; "ShareSDKConnector_Error_Facebook_NOClient" = "分享平台[Facebook]尚未安装客户端!无法进行分享!"; "ShareSDKConnector_Error_FacebookMessager_NOClient" = "分享平台[Facebook Messenger]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_FacebookMessager_NOLibShare" = "分享平台[微信]尚未导入FBSDKMessengerShareKit.framework库!无法进行分享"; "ShareSDKConnector_Error_MeiPai_NOLib" = "请将MPShareSDK.framework导入项目中"; "ShareSDKConnector_Error_MeiPai_NOLibShare" = "分享平台[美拍]尚未导入MPShareSDK.framework库!无法进行相关操作"; "ShareSDKConnector_Error_MeiPai_NOShare" = "分享平台[美拍]客户端不支持此类分享功能" "ShareSDKConnector_Error_MeiPai_NOShareVideo" = "分享平台[美拍]客户端版本不支持视频分享功能"; "ShareSDKConnector_Error_MeiPai_NOSharePhoto" = "分享平台[美拍]客户端版本不支持图片分享功能"; "ShareSDKConnector_Error_MeiPai_NOClient" = "分享平台[美拍]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_MeiPai_PhotoLibraryUsageDescription" = "未配置相册权限 NSPhotoLibraryUsageDescription 无法判定传入相册资源的类型 则统一使用图片类型分享"; "ShareSDKConnector_Error_DingTalk_NOLib" = "请将DTShareKit.framework导入项目"; "ShareSDKConnector_Error_DingTalk_NOLibShare" = "分享平台[钉钉]尚未导入DTShareKit.framework库!无法进行相关操作"; "ShareSDKConnector_Error_DingTalk_NOClient" = "分享平台[钉钉]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_DingTalk_NOShare" = "分享平台[钉钉]客户端不支持分享功能"; "ShareSDKConnector_Error_Yixin_NOLib" = "请将libYixinSDK.a导入项目并引入YXApi.h"; "ShareSDKConnector_Error_Yixin_Auth" = "[易信]授权失败"; "ShareSDKConnector_Error_Yixin_SSO" = "[易信]客户端不支持SSO授权功能"; "ShareSDKConnector_Error_Yixin_NOLibShare" = "分享平台[易信]尚未导入YXApi.a库!无法进行相关操作"; "ShareSDKConnector_Error_Yixin_NOShare" = "分享平台[易信]客户端不支持分享功能"; "ShareSDKConnector_Error_Yixin_NOClient" = "分享平台[易信]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_KaKao_NOLib" = "请将KakaoOpenAPI.framework导入项目并引入KOSession.h" "ShareSDKConnector_Error_KaKao_NOLibShare" = "分享平台[KaKao]尚未导入KakaoOpenSDK.framework! 无法进行相关操作"; "ShareSDKConnector_Error_KaKao_Callback" = "无效的回调请求"; "ShareSDKConnector_Error_KaKao_ShareTalk" = "[Kakao] 的Talk客户端分享失败,请检查分享参数"; "ShareSDKConnector_Error_KaKao_Talk" = "分享平台[KaKao]不支持Talk客户端分享"; "ShareSDKConnector_Error_KaKao_Story" = "分享平台[KaKao]不支持Story客户端分享"; "ShareSDKConnector_Error_AliPay_NOLib" = "请将libAPOpenSdk.a导入项目并引入APOpenAPI"; "ShareSDKConnector_Error_AliPay_NOShare" = "分享平台[支付宝]客户端不支持分享功能"; "ShareSDKConnector_Error_AliPay_NOClient" = "分享平台[支付宝]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_AliPay_NOLibShare" = "分享平台[支付宝]尚未导入libAPOpenSdk.a库! 无法进行相关操作"; "ShareSDKConnector_Error_Line_NOLib" = "请将LineSDK.framework导入项目"; "ShareSDKConnector_Error_Line_NOLibShare" = "分享平台[Line]尚未导入LineSDK.framework! 无法进行相关操作"; "ShareSDKConnector_Error_Instagram_PhotoLibrary" = "尚未授权访问相册,无法进行分享"; "ShareSDKConnector_Error_Mail" = "该设备不支持发送邮件"; "ShareSDKConnector_Error_RenRen_NOLib" = "请将RennSDK.framework导入项目中"; "ShareSDKConnector_Error_RenRen_NOLibShare" = "分享平台[人人网]尚未导入RennSDK.framework库! 无法进行相关操作"; "ShareSDKConnector_Error_RenRen_Auth" = "分享平台[人人网]授权调用失败"; "ShareSDKConnector_Error_QQ_NOLib" = "请将TencentOpenAPI.framework导入项目中"; "ShareSDKConnector_Error_QQ_NOLibShare" = "分享平台[QQ]尚未导入TencentOpenApi.framework! 无法进行相关操作"; "ShareSDKConnector_Error_QQ_NOClient" = "分享平台[QQ]尚未安装客户端!无法进行分享"; "ShareSDKConnector_Error_QQ_Share" = "分享平台[QQ]分享失败"; "ShareSDKConnector_Error_QQ_Version" = "当前QQ版本太低,需要更新至新版本才可以支持"; "ShareSDKConnector_Error_QQ_QZone" = "分享平台[QQ]调用分享失败!当前QQSDK不支持QZONE文字分享"; "ShareSDKConnector_Error_QQ_ShareScene" = "无法识别的分享场景"; "ShareSDKConnector_Error_QQ_Auth" = "分享平台[QQ]授权调用失败"; "ShareSDKConnector_Error_QQ_ShareType" = "不支持此分享类型"; "ShareSDKConnector_Error_Weibo_NOLibShare" = "分享平台[微博]尚未导入libWeiboSDK.a库! 无法进行相关操作"; "ShareSDKConnector_Error_Weibo_Auth" = "分享平台[微博]授权调用失败"; ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDK.bundle/zh-Hans.lproj/country.plist ================================================ A 安哥拉+244 阿富汗+93 阿鲁巴+297 阿尔巴尼亚+355 阿尔及利亚+213 安道尔共和国+376 安圭拉岛+1264 安提瓜和巴布达+1268 阿根廷+54 亚美尼亚+374 澳大利亚+61 奥地利+43 阿塞拜疆+994 埃及+20 爱沙尼亚+372 爱尔兰+353 澳门+853 阿曼+968 阿拉伯联合酋长国+971 B 巴哈马+1242 巴林+973 巴巴多斯+1246 白俄罗斯+375 比利时+32 伯利兹+501 贝宁+229 不丹+975 波斯尼亚和黑塞哥维那的+387 百慕大群岛+1441 玻利维亚+591 博茨瓦纳+267 巴西+55 文莱+673 保加利亚+359 布基纳法索+226 布隆迪+257 冰岛+354 巴基斯坦+92 巴拿马+507 巴布亚新几内亚+675 巴勒斯坦+970 巴拉圭+595 波兰+48 波多黎各+1787 C 赤道几内亚+240 D 丹麦+45 多米尼加共和国+1809 多米尼加+1767 德国+49 东帝汶+670 多哥+228 E 厄瓜多尔+593 俄罗斯+7 F 斐济+679 芬兰+358 佛得角+238 法罗群岛+298 法国+33 法属圭亚那+594 菲律宾+63 法属玻利尼西亚+689 法属留尼汪岛+262 G 哥伦比亚+57 刚果共和国+242 刚果民主共和国+243 哥斯达黎加+506 古巴+53 瓜德罗普岛+590 冈比亚+220 格鲁吉亚+995 格林纳达+1473 格陵兰岛+299 关岛+1671 圭亚那+592 H 海地+509 洪都拉斯+504 哈萨克斯坦+7 韩国+82 荷属安的列斯群岛+599 荷兰+31 黑山+382 I J 加拿大+1 捷克+420 吉布提+253 加蓬+241 加纳+233 几内亚+224 几内亚比绍+245 基里巴斯+686 柬埔寨+855 吉尔吉斯坦+996 津巴布韦+263 K 开曼群岛+1345 库克群岛+682 科特迪瓦+225 科摩罗+269 肯尼亚+254 克罗地亚+385 科威特+965 喀麦隆+237 卡塔尔+974 L 老挝+856 拉脱维亚+371 黎巴嫩+961 莱索托+266 利比里亚+231 利比亚+218 列支敦士登+423 立陶宛+370 卢森堡+352 卢旺达+250 罗马尼亚+40 M 缅甸+95 马达加斯加+261 马拉维+265 马来西亚+60 马尔代夫+960 马其顿+389 马约特岛+269 马里+223 马耳他+356 马提尼克+596 毛里塔尼亚+222 毛里求斯+230 墨西哥+52 密克罗尼西亚+691 摩尔多瓦+373 摩纳哥+377 蒙古+976 蒙特塞拉特岛+1664 摩洛哥+212 莫桑比克+258 秘鲁+51 美国+1 美属维尔京群岛+1284 孟加拉国+880 N 纳米比亚+264 尼泊尔+977 尼加拉瓜+505 尼日尔+227 尼日利亚+234 挪威+47 南非+27 南苏丹+211 O P 葡萄牙+351 帕劳+680 Q R 日本+81 瑞典+46 瑞士+41 S 塞浦路斯+357 萨尔瓦多+503 圣卢西亚+1758 圣文森特和格林纳丁斯+1784 圣多美和普林西比+239 圣基茨和尼维斯+1869 沙特阿拉伯+966 塞内加尔+221 塞舌尔+248 塞拉利昂+232 塞尔维亚+381 斯洛伐克+421 斯洛文尼亚+386 所罗门群岛+677 索马里+252 斯里兰卡+94 苏丹+249 苏里南+597 斯威士兰+268 T 台湾省+886 塔吉克斯坦+992 坦桑尼亚+255 泰国+66 汤加+676 特立尼达和多巴哥+1868 特克斯科斯群岛+1649 突尼斯+216 土耳其+90 土库曼斯坦+993 U V W 危地马拉+502 乌干达+256 乌克兰+380 乌拉圭+598 乌兹别克斯坦+998 委内瑞拉+58 瓦努阿图+678 X 香港+852 希腊+30 匈牙利+36 新西兰+64 萨摩亚+685 新加坡+65 新喀里多尼亚+687 西班牙+34 叙利亚+963 Y 也门+967 印度+91 印度尼西亚+62 伊朗+98 伊拉克+964 以色列+972 意大利+39 牙买加+1876 约旦+962 英国+44 英属维尔京群岛+1340 越南+84 Z 赞比亚+260 中非共和国+236 乍得+235 智利+56 中国+86 直布罗陀+350 ================================================ FILE: BeeFun/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required/ShareSDKConnector.framework/Headers/ShareSDKConnector.h ================================================ // // ShareSDKConnector.h // ShareSDKConnector // // Created by fenghj on 15/6/2. // Copyright (c) 2015年 mob. All rights reserved. // #import #import /** * ShareSDK连接器 */ @interface ShareSDKConnector : NSObject + (void)connectWeChat:(Class)wxApiClass; /** * 链接微信API已供ShareSDK可以正常使用微信的相关功能(授权、分享) * * @param wxApiClass 微信SDK中的类型,应先导入libWXApi.a,再传入[WXApi class]到此参数。注:此参数不能为nil,否则会导致授权、分享无法正常使用 * @param delegate 对于需要获取微信回复或请求时传入该委托对象。该对象必须实现WXApiDelegate协议中的方法。 */ + (void)connectWeChat:(Class)wxApiClass delegate:(id)delegate; /** * 连接微博API以供ShareSDK可以使用微博客户端来分享内容,不调用此方法也不会影响应用内分享、授权等相关功能。 * * @param weiboSDKClass 微博SDK中的类型,应先导入libWeiboSDK.a,再传入[WeiboSDK class]到此参数. */ + (void)connectWeibo:(Class)weiboSDKClass; /** * 连接QQAPI以供ShareSDK可以正常使用QQ或者QQ空间客户端来授权或者分享内容。 * * @param qqApiInterfaceClass QQSDK中的类型,应先导入TencentOpenAPI.framework,再传入[QQApiInterface class]到此参数。 * @param tencentOAuthClass QQSDK中的类型,应先导入TencentOpenAPI.framework,再传入[TencentOAuth class]到此参数。 */ + (void)connectQQ:(Class)qqApiInterfaceClass tencentOAuthClass:(Class)tencentOAuthClass; /** * 连接人人网SDK以供ShareSDK可以正常使用人人网客户端进行SSO授权。 * * @param rennClientClass 人人网SDK中的类型,应先导入RennSDK.framework,再传入[RennClient class]到此参数。 */ + (void)connectRenren:(Class)rennClientClass; /** * 链接支付宝好友以供ShareSDK可以正常使用支付宝进行分享 * * @param apOpenApiClass 支付宝好友SDK中的类型,应先导入libAPOpenSdk.a,再将[APOpenApi class]传入到此参数。注:此参数不能为nil,否则会导致无法正常分享。 */ + (void)connectAliPaySocial:(Class)apOpenApiClass; /** * 链接KaKao以供ShareSDK可以正常使用KaKao进行分享 * * @param koSessionClass KaKao SDK中的类型,应先导入KakaoOpenSDK.framework,再将[KOSession class]传入到此参数。 */ + (void)connectKaKao:(Class)koSessionClass; /** * 链接易信以供ShareSDK可以正常使用易信的相关功能(包括授权、分享) * * @param yxApiClass 易信SDK中的类型,应先导入YXApi.h,再将[YXApi class]传入到参数中。 */ + (void)connectYiXin:(Class)yxApiClass; /** * 链接Facebook Messenger以供ShareSDK可以正常使用Facebook Messenger的相关功能 * * @param fbmApiClass Facebook Messenger SDK中的类型,应先导入FBSDKMessengerShareKit.framework,再将[FBSDKMessengerSharer class]传入到参数中。 */ + (void)connectFacebookMessenger:(Class)fbmApiClass; /** * 链接钉钉以供ShareSDK可以正常使用钉钉进行分享 * * @param dtOpenApiClass 钉钉 SDK中的类型,应先导入DTShareKit.framework,再将[DTOpenAPI class]传入到此参数。 */ + (void)connectDingTalk:(Class)dtOpenApiClass; /** * 链接Line以供ShareSDK可以正常使用Line进行分享 * * @param lineSDKClass Line SDK中的类型,应先导入LineAdapter.framework,再将[LineSDK class]传入到此参数。 */ + (void)connectLine:(Class)lineSDKClass; /** * 链接MeiPai以供ShareSDK可以正常使用MeiPai进行分享 * * @param MPShareSDKClass MeiPai SDK中的类型,应先导入MPShareSDK.framework,再将[MPShareSDK class]传入到此参数。 */ + (void)connectMeiPai:(Class)MPShareSDKClass; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/UMMobClick.framework/Versions/A/Headers/MobClick.h ================================================ // // MobClick.h // Analytics // // Copyright (C) 2010-2016 Umeng.com . All rights reserved. #import #import #define XcodeAppVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] typedef void(^CallbackBlock)(); /** REALTIME只在“集成测试”设备的DEBUG模式下有效,其它情况下的REALTIME会改为使用BATCH策略。 */ typedef enum { REALTIME = 0, //实时发送 (只在“集成测试”设备的DEBUG模式下有效) BATCH = 1, //启动发送 SEND_INTERVAL = 6, //最小间隔发送 ([90-86400]s, default 90s) SMART_POLICY = 8, } ReportPolicy; /** 统计的场景类别,默认为普通统计;若使用游戏统计API,则需选择游戏场景类别,如E_UM_GAME。 */ typedef NS_ENUM (NSUInteger, eScenarioType) { E_UM_NORMAL = 0, // default value E_UM_GAME = 1, // game }; /** @brief 统计SDK的配置实例,具体参照该类成员的参数定义 * 示例代码: UMConfigInstance.appKey = @"xxxxxxxxxxxxxx..."; * UMConfigInstance.token = @"yyyyyyyy...."; * [MobClick startWithConfigure:UMConfigInstance]; */ #define UMConfigInstance [UMAnalyticsConfig sharedInstance] @interface UMAnalyticsConfig : NSObject /** required: appkey string */ @property(nonatomic, copy) NSString *appKey; /** optional: default: nil*/ @property(nonatomic, copy) NSString *secret; /** optional: default: "App Store"*/ @property(nonatomic, copy) NSString *channelId; /** optional: default: YES */ @property(nonatomic) BOOL bCrashReportEnabled; /** optional: default: BATCH */ @property(nonatomic) ReportPolicy ePolicy; /** optional: default: E_UM_NORMAL */ @property(nonatomic) eScenarioType eSType; + (instancetype)sharedInstance; @end @class CLLocation; @interface MobClick : NSObject #pragma mark basics ///--------------------------------------------------------------------------------------- /// @name 初始化统计 ///--------------------------------------------------------------------------------------- /** 初始化友盟统计模块 @param UMAnalyticsConfig 实例类,具体参照该类成员的参数定义 @return void */ + (void) startWithConfigure:(UMAnalyticsConfig *)configure; ///--------------------------------------------------------------------------------------- /// @name 设置 ///--------------------------------------------------------------------------------------- /** 设置app版本号。由于历史原因需要和xcode3工程兼容,友盟提取的是Build号(CFBundleVersion), 如果需要和App Store上的版本一致,请调用此方法。 @param appVersion 版本号,例如设置成`XcodeAppVersion`. @return void. */ + (void)setAppVersion:(NSString *)appVersion; /** 开启CrashReport收集, 默认YES(开启状态). @param value 设置为NO,可关闭友盟CrashReport收集功能. @return void. */ + (void)setCrashReportEnabled:(BOOL)value; /** 设置是否打印sdk的log信息, 默认NO(不打印log). @param value 设置为YES,umeng SDK 会输出log信息可供调试参考. 除非特殊需要,否则发布产品时需改回NO. @return void. */ + (void)setLogEnabled:(BOOL)value; /** 设置是否对日志信息进行加密, 默认NO(不加密). @param value 设置为YES, umeng SDK 会将日志信息做加密处理 @return void. */ + (void)setEncryptEnabled:(BOOL)value; /** 当reportPolicy == SEND_INTERVAL 时设定log发送间隔 @param second 单位为秒,最小90秒,最大86400秒(24hour). @return void. */ + (void)setLogSendInterval:(double)second; #pragma mark event logs ///--------------------------------------------------------------------------------------- /// @name 页面计时 ///--------------------------------------------------------------------------------------- /** 手动页面时长统计, 记录某个页面展示的时长. @param pageName 统计的页面名称. @param seconds 单位为秒,int型. @return void. */ + (void)logPageView:(NSString *)pageName seconds:(int)seconds; /** 自动页面时长统计, 开始记录某个页面展示时长. 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: @param pageName 统计的页面名称. @return void. */ + (void)beginLogPageView:(NSString *)pageName; /** 自动页面时长统计, 结束记录某个页面展示时长. 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: @param pageName 统计的页面名称. @return void. */ + (void)endLogPageView:(NSString *)pageName; ///--------------------------------------------------------------------------------------- /// @name 事件统计 ///--------------------------------------------------------------------------------------- /** 结构化事件 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID。 @param keyPath 字符串数组代表的结构化事件路径,其长度最大为8,不能使用unicode 48以内的字符,keyPath[0]必须在网站注册事件ID. @param value 事件的数值 @param (optional) label 标签 @return void. */ + (void)event:(NSArray *)keyPath value:(int)value label:(NSString *)label; /** 自定义事件,数量统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID @param eventId 网站上注册的事件Id. @param label 分类标签。不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签. @param accumulation 累加值。为减少网络交互,可以自行对某一事件ID的某一分类标签进行累加,再传入次数作为参数。 @return void. */ + (void)event:(NSString *)eventId; //等同于 event:eventId label:eventId; /** 自定义事件,数量统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID */ + (void)event:(NSString *)eventId label:(NSString *)label; // label为nil或@""时,等同于 event:eventId label:eventId; /** 自定义事件,数量统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID */ + (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes; + (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes counter:(int)number; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. beginEvent,endEvent要配对使用,也可以自己计时后通过durations参数传递进来 @param eventId 网站上注册的事件Id. @param label 分类标签。不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签. @param primarykey 这个参数用于和event_id一起标示一个唯一事件,并不会被统计;对于同一个事件在beginEvent和endEvent 中要传递相同的eventId 和 primarykey @param millisecond 自己计时需要的话需要传毫秒进来 @return void. @warning 每个event的attributes不能超过10个 eventId、attributes中key和value都不能使用空格和特殊字符,必须是NSString,且长度不能超过255个字符(否则将截取前255个字符) id, ts, du是保留字段,不能作为eventId及key的名称 */ + (void)beginEvent:(NSString *)eventId; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)endEvent:(NSString *)eventId; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)beginEvent:(NSString *)eventId label:(NSString *)label; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)endEvent:(NSString *)eventId label:(NSString *)label; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)beginEvent:(NSString *)eventId primarykey :(NSString *)keyName attributes:(NSDictionary *)attributes; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)endEvent:(NSString *)eventId primarykey:(NSString *)keyName; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)event:(NSString *)eventId durations:(int)millisecond; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)event:(NSString *)eventId label:(NSString *)label durations:(int)millisecond; /** 自定义事件,时长统计. 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. */ + (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes durations:(int)millisecond; #pragma mark - user methods /** active user sign-in. 使用sign-In函数后,如果结束该PUID的统计,需要调用sign-Off函数 @param puid : user's ID @param provider : 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。 @return void. */ + (void)profileSignInWithPUID:(NSString *)puid; + (void)profileSignInWithPUID:(NSString *)puid provider:(NSString *)provider; /** active user sign-off. 停止sign-in PUID的统计 @return void. */ + (void)profileSignOff; ///--------------------------------------------------------------------------------------- /// @name 地理位置设置 /// 需要链接 CoreLocation.framework 并且 #import ///--------------------------------------------------------------------------------------- /** 设置经纬度信息 @param latitude 纬度. @param longitude 经度. @return void */ + (void)setLatitude:(double)latitude longitude:(double)longitude; /** 设置经纬度信息 @param location CLLocation 经纬度信息 @return void */ + (void)setLocation:(CLLocation *)location; ///--------------------------------------------------------------------------------------- /// @name Utility函数 ///--------------------------------------------------------------------------------------- /** 判断设备是否越狱,依据是否存在apt和Cydia.app */ + (BOOL)isJailbroken; /** 判断App是否被破解 */ + (BOOL)isPirated; #pragma mark DEPRECATED /** 友盟模块启动 [MobClick startWithConfigure:]通常在application:didFinishLaunchingWithOptions:里被调用监听App启动和退出事件, 如果开发者无法在此处添加友盟的[MobClick startWithConfigure:]方法,App的启动事件可能会无法监听,此时需要手动调用[MobClick startSession:nil]来启动友盟的session。 上述情况通常发生在某些第三方框架生成的app里,普通app不用关注该API. */ + (void)startSession:(NSNotification *)notification; + (void)setCrashCBBlock:(CallbackBlock)cbBlock; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/UMMobClick.framework/Versions/A/Headers/MobClickGameAnalytics.h ================================================ // // MobClickGameAnalytics.h // Analytics // // Copyright (C) 2010-2014 Umeng.com . All rights reserved. @interface MobClickGameAnalytics : NSObject #pragma mark - account function /** active user sign-in. 使用sign-In函数后,如果结束该PUID的统计,需要调用sign-Off函数 @param puid : user's ID @param provider : 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。 @return void. */ + (void)profileSignInWithPUID:(NSString *)puid; + (void)profileSignInWithPUID:(NSString *)puid provider:(NSString *)provider; /** active user sign-off. 停止sign-in PUID的统计 @return void. */ + (void)profileSignOff; #pragma mark GameLevel methods ///--------------------------------------------------------------------------------------- /// @name set game level ///--------------------------------------------------------------------------------------- /** 设置玩家的等级. */ /** 设置玩家等级属性. @param level 玩家等级 @return void */ + (void)setUserLevelId:(int)level; ///--------------------------------------------------------------------------------------- /// @name 关卡统计 ///--------------------------------------------------------------------------------------- /** 记录玩家进入关卡,通过关卡及失败的情况. */ /** 进入关卡. @param level 关卡 @return void */ + (void)startLevel:(NSString *)level; /** 通过关卡. @param level 关卡,如果level == nil 则为当前关卡 @return void */ + (void)finishLevel:(NSString *)level; /** 未通过关卡. @param level 关卡,如果level == nil 则为当前关卡 @return void */ + (void)failLevel:(NSString *)level; #pragma mark - #pragma mark Pay methods ///--------------------------------------------------------------------------------------- /// @name 支付统计 ///--------------------------------------------------------------------------------------- /** 记录玩家交易兑换货币的情况 @param currencyAmount 现金或等价物总额 @param currencyType 为ISO4217定义的3位字母代码,如CNY,USD等(如使用其它自定义等价物作为现金,可使用ISO4217中未定义的3位字母组合传入货币类型) @param virtualAmount 虚拟币数量 @param channel 支付渠道 @param orderId 交易订单ID @return void */ + (void)exchange:(NSString *)orderId currencyAmount:(double)currencyAmount currencyType:(NSString *)currencyType virtualCurrencyAmount:(double)virtualAmount paychannel:(int)channel; /** 玩家支付货币兑换虚拟币. @param cash 真实货币数量 @param source 支付渠道 @param coin 虚拟币数量 @return void */ + (void)pay:(double)cash source:(int)source coin:(double)coin; /** 玩家支付货币购买道具. @param cash 真实货币数量 @param source 支付渠道 @param item 道具名称 @param amount 道具数量 @param price 道具单价 @return void */ + (void)pay:(double)cash source:(int)source item:(NSString *)item amount:(int)amount price:(double)price; #pragma mark - #pragma mark Buy methods ///--------------------------------------------------------------------------------------- /// @name 虚拟币购买统计 ///--------------------------------------------------------------------------------------- /** 记录玩家使用虚拟币的消费情况 */ /** 玩家使用虚拟币购买道具 @param item 道具名称 @param amount 道具数量 @param price 道具单价 @return void */ + (void)buy:(NSString *)item amount:(int)amount price:(double)price; #pragma mark - #pragma mark Use methods ///--------------------------------------------------------------------------------------- /// @name 道具消耗统计 ///--------------------------------------------------------------------------------------- /** 记录玩家道具消费情况 */ /** 玩家使用虚拟币购买道具 @param item 道具名称 @param amount 道具数量 @param price 道具单价 @return void */ + (void)use:(NSString *)item amount:(int)amount price:(double)price; #pragma mark - #pragma mark Bonus methods ///--------------------------------------------------------------------------------------- /// @name 虚拟币及道具奖励统计 ///--------------------------------------------------------------------------------------- /** 记录玩家获赠虚拟币及道具的情况 */ /** 玩家获虚拟币奖励 @param coin 虚拟币数量 @param source 奖励方式 @return void */ + (void)bonus:(double)coin source:(int)source; /** 玩家获道具奖励 @param item 道具名称 @param amount 道具数量 @param price 道具单价 @param source 奖励方式 @return void */ + (void)bonus:(NSString *)item amount:(int)amount price:(double)price source:(int)source; #pragma mark DEPRECATED //已经被新的setUserLevelId:方法替代,请使用新的API。 + (void)setUserLevel:(NSString *)level; //已经被新的active user方法替代,请使用新的API。 + (void)setUserID:(NSString *)userId sex:(int)sex age:(int)age platform:(NSString *)platform; @end ================================================ FILE: BeeFun/BeeFun/ThirdParty/UMMobClick.framework/Versions/A/Headers/MobClickSocialAnalytics.h ================================================ // // MobClickSocialAnalytics.h // SocialSDK // // Created by yeahugo on 13-3-4. // Copyright (c) 2013年 Umeng. All rights reserved. // #import typedef NSString * MobClickSocialTypeString; extern MobClickSocialTypeString const MobClickSocialTypeSina; //新浪微博 extern MobClickSocialTypeString const MobClickSocialTypeTencent; //腾讯微博 extern MobClickSocialTypeString const MobClickSocialTypeRenren; //人人网 extern MobClickSocialTypeString const MobClickSocialTypeQzone; //Qzone extern MobClickSocialTypeString const MobClickSocialTypeRenren; //人人网 extern MobClickSocialTypeString const MobClickSocialTypeDouban; //douban extern MobClickSocialTypeString const MobClickSocialTypeWxsesion; //微信好友分享 extern MobClickSocialTypeString const MobClickSocialTypeWxtimeline; //微信朋友圈 extern MobClickSocialTypeString const MobClickSocialTypeHuaban; //花瓣 extern MobClickSocialTypeString const MobClickSocialTypeKaixin; //开心 extern MobClickSocialTypeString const MobClickSocialTypeFacebook; //facebook extern MobClickSocialTypeString const MobClickSocialTypeTwitter; //twitter extern MobClickSocialTypeString const MobClickSocialTypeInstagram; //instagram extern MobClickSocialTypeString const MobClickSocialTypeFlickr; //flickr extern MobClickSocialTypeString const MobClickSocialTypeQQ; //qq extern MobClickSocialTypeString const MobClickSocialTypeWxfavorite; //微信收藏 extern MobClickSocialTypeString const MobClickSocialTypeLwsession; //来往 extern MobClickSocialTypeString const MobClickSocialTypeLwtimeline; //来往动态 extern MobClickSocialTypeString const MobClickSocialTypeYxsession; //易信 extern MobClickSocialTypeString const MobClickSocialTypeYxtimeline; //易信朋友圈 /** 微博类,发送微博之后在回调方法初始化此对象 */ @interface MobClickSocialWeibo : NSObject /** 微博平台类型,使用上面定义的几种常量字符串 */ @property (nonatomic, copy) NSString *platformType; /** 微博id */ @property (nonatomic, copy) NSString *weiboId; /** 用户在微博平台的id */ @property (nonatomic, copy) NSString *userId; /** 微博平台的自定义字段,例如定义{‘gender’:0,’name’:’xxx’} */ @property (nonatomic, strong) NSDictionary *param; /** 初始化方法,在发送微博结束的回调方法使用此初始化方法 @param platformType 微博平台类型 @param weiboId 微博id,可以设置为nil @param userId 用户id @param param 微博平台自定义字段,可以设置为nil @return 微博对象 */ -(id)initWithPlatformType:(MobClickSocialTypeString)platformType weiboId:(NSString *)weiboId usid:(NSString *)usid param:(NSDictionary *)param; @end /** 发送统计完成的block对象 */ typedef void (^MobClickSocialAnalyticsCompletion)(NSDictionary * response, NSError *error); /** 负责统计微博类。 分享微博完成之后需要先构造`MobClickSocialWeibo`组成微博数组,然后再用类方法发送微博数组 ``` +(void)postWeiboCounts:(NSArray *)weibos appKey:(NSString *)appKey topic:(NSString *)topic completion:(MobClickSocialAnalyticsCompletion)completion; ``` 例如 MobClickSocialWeibo *tencentWeibo = [[MobClickSocialWeibo alloc] initWithPlatformType:UMSocialTypeTencent weiboId:nil userId:@"tencent123" param:@{@"gender":@"1"}]; [MobClickSocialAnalytics postWeibos:@[tencentWeibo] appKey:@"507fcab25270157b37000010" topic:@"test" completion:^(NSDictionary *result, NSError *error) { NSLog(@"result is %@", result); }]; */ @interface MobClickSocialAnalytics : NSObject /** 发送统计微博 @param weibos UMSocialWeibo对象组成的数组 @param appKey 友盟appkey @param topic 话题,可选,可以设置为nil @parma completion 发送完成的事件处理block */ +(void)postWeiboCounts:(NSArray *)weibos appKey:(NSString *)appKey topic:(NSString *)topic completion:(MobClickSocialAnalyticsCompletion)completion; @end ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSHMSegmentedBridge.swift ================================================ // // JSHMSegmentedControlBridge.swift // BeeFun // // Created by WengHengcong on 2017/3/28. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import HMSegmentedControl class JSHMSegmentedBridge: NSObject { class func segmentControl(titles: [String]) -> HMSegmentedControl! { let segControl = HMSegmentedControl(sectionTitles: titles)! segControl.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: 35) segControl.verticalDividerColor = UIColor.bfLineBackgroundColor segControl.verticalDividerWidth = 0.5 // segControl.isVerticalDividerEnabled = true segControl.selectionStyle = HMSegmentedControlSelectionStyle.fullWidthStripe segControl.selectionIndicatorLocation = HMSegmentedControlSelectionIndicatorLocation.down segControl.selectionIndicatorColor = UIColor.bfRedColor segControl.selectionIndicatorHeight = 1 segControl.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.iOS11Black, NSAttributedString.Key.font: UIFont.middleSizeSystemFont()] segControl.selectedTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.bfRedColor, NSAttributedString.Key.font: UIFont.middleSizeSystemFont()] return segControl } class func segmentControl() -> HMSegmentedControl! { let segControl = HMSegmentedControl() segControl.verticalDividerColor = UIColor.bfLineBackgroundColor segControl.segmentWidthStyle = .dynamic segControl.verticalDividerWidth = 0.5 // segControl.isVerticalDividerEnabled = true segControl.segmentEdgeInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) segControl.selectionStyle = .fullWidthStripe segControl.selectionIndicatorLocation = HMSegmentedControlSelectionIndicatorLocation.down segControl.selectionIndicatorColor = UIColor.bfRedColor segControl.selectionIndicatorHeight = 1 segControl.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.iOS11Black, NSAttributedString.Key.font: UIFont.middleSizeSystemFont()] segControl.selectedTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.bfRedColor, NSAttributedString.Key.font: UIFont.middleSizeSystemFont()] return segControl } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSMBHUDBridge.swift ================================================ // // MBProgressHud+JS.swift // BeeFun // // Created by WengHengcong on 10/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import MBProgressHUD class JSMBHUDBridge { static let MBHudHideDelay: TimeInterval = 1.35 class func mbProgressHud(message: String?, view: UIView?) -> MBProgressHUD { var hud: MBProgressHUD? = nil if view == nil { hud = MBProgressHUD.showAdded(to: BFTabbarManager.jsKeywindow!, animated: true) } else { hud = MBProgressHUD.showAdded(to: view!, animated: true) } if message != nil { hud?.label.text = message } hud?.minShowTime = 0.25 hud?.label.font = UIFont.bfSystemFont(ofSize: 15.0) hud?.removeFromSuperViewOnHide = true hud?.isUserInteractionEnabled = false return hud! } // MARK: - Show Indeterminate Hud class func showHud(view: UIView) -> MBProgressHUD { let hud = mbProgressHud(message: nil, view: view) return hud } class func showHud() -> MBProgressHUD { let hud = mbProgressHud(message: nil, view: BFTabbarManager.jsKeywindow) return hud } // MARK: - Show Text class func showText(_ message: String) { showText(message, time: MBHudHideDelay) } class func showText(_ message: String, time: TimeInterval) { showText(message, view: BFTabbarManager.jsKeywindow!, time: time) } class func showText(_ message: String, view: UIView) { showText(message, view: view, time: MBHudHideDelay) } class func showText(_ message: String, view: UIView, time: TimeInterval) { DispatchQueue.main.async { let hud = mbProgressHud(message: message, view: view) hud.mode = .text hud.hide(animated: true, afterDelay: time) } } // MARK: - Show Custom View class func showImage(_ message: String, icon: String, view: UIView) { showImage(message, icon: icon, view: view, time: MBHudHideDelay) } class func showImage(_ message: String, icon: String, time: TimeInterval) { showImage(message, icon: icon, view: BFTabbarManager.jsKeywindow!, time: MBHudHideDelay) } class func showImage(_ message: String, icon: String, view: UIView, time: TimeInterval) { DispatchQueue.main.async { let hud = mbProgressHud(message: message, view: view) hud.customView = UIImageView(image: UIImage(named: icon)) hud.mode = .customView hud.minShowTime = 0.35 hud.hide(animated: true, afterDelay: time) } } // MARK: - Hide class func hideHud(view: UIView) { DispatchQueue.main.async { MBProgressHUD.hide(for: view, animated: true) } } class func hideHud(hud: MBProgressHUD) { DispatchQueue.main.async { hud.hide(animated: true) } } /// 隐藏当前页面所有的hud class func hideAllHudInView(view: UIView) { DispatchQueue.main.async { MBProgressHUD.hideAllHUDs(for: view, animated: true) } } } extension JSMBHUDBridge { // MARK: - 各种类型的弹窗 // MARK: Info class func showInfo(_ message: String, view: UIView) { showInfo(message, view: view, time: MBHudHideDelay) } class func showInfo(_ message: String) { showInfo(message, time: MBHudHideDelay) } class func showInfo(_ message: String, view: UIView, time: TimeInterval) { showImage(message, icon: "jsmb_info", view: view, time: time) } class func showInfo(_ message: String, time: TimeInterval) { showImage(message, icon: "jsmb_info", time: time) } // MARK: Error class func showError(_ message: String, view: UIView) { showError(message, view: view, time: MBHudHideDelay) } class func showError(_ message: String) { showInfo(message, time: MBHudHideDelay) } class func showError(_ message: String, view: UIView, time: TimeInterval) { showImage(message, icon: "jsmb_error", view: view, time: time) } class func showError(_ message: String, time: TimeInterval) { showImage(message, icon: "jsmb_error", time: time) } // MARK: Success class func showSuccess(_ message: String) { showSuccess(message, time: MBHudHideDelay) } class func showSuccess(_ message: String, view: UIView) { showSuccess(message, view: view, time: MBHudHideDelay) } class func showSuccess(_ message: String, view: UIView, time: TimeInterval) { showImage(message, icon: "jsmb_success", view: view, time: time) } class func showSuccess(_ message: String, time: TimeInterval) { showImage(message, icon: "jsmb_success", time: time) } // MARK: Warn class func showWarn(_ message: String, view: UIView) { showWarn(message, view: view, time: MBHudHideDelay) } class func showWarn(_ message: String) { showWarn(message, time: MBHudHideDelay) } class func showWarn(_ message: String, view: UIView, time: TimeInterval) { showImage(message, icon: "", view: view, time: time) } class func showWarn(_ message: String, time: TimeInterval) { showImage(message, icon: "", time: time) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSMBProgressHud.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSMBProgressHud.xcassets/jsmb_error.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "error.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "error (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSMBProgressHud.xcassets/jsmb_info.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "info (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "info-1.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSMBProgressHud.xcassets/jsmb_success.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "success.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "success (1).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSSQLiteSwiftBridge.swift ================================================ // // JSSQLiteSwiftBridge.swift // BeeFun // // Created by WengHengcong on 22/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import SQLite class JSSQLiteSwiftBridge: NSObject { /// 数据库名称 var dbName: String? /// 数据库路径 var dbPath: String? /// 连接数据库 func connection() -> Connection { assert((dbName != nil) || (dbPath != nil)) if dbName != nil { return connection(name: dbName!) } else if dbPath != nil { return connection(path: dbPath!) } else { dbName = "db.sqlite3" return connection(name: dbName!) } } func connection(name: String) -> Connection { assert(!name.isEmpty) let dbpath = JSFileManager.documentsUrl.appendingPathComponent(name).absoluteString return connection(path: dbpath) } func connection(path: String) -> Connection { assert(!path.isEmpty) let db = try! Connection(path) return db } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSSVPHUDBridge.swift ================================================ // // JSSVProgressHUDBridge.swift // BeeFun // // Created by WengHengcong on 10/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit //import SVProgressHUD class JSSVPHUDBridge: NSObject { class func show() { // SVProgressHUD.show() } class func dismiss() { // SVProgressHUD.dismiss() } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSBridge/JSSwiftyBeaver.swift ================================================ // // JSSwiftyBeaverBridge.swift // LoveYou // // Created by WengHengcong on 2016/10/30. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import SwiftyBeaver let JSLog = SwiftyBeaver.self class JSSwiftyBeaver: NSObject { public class func bridgeInit() { // add log destinations. at least one is needed! let console = ConsoleDestination() // log to Xcode Console //let file = FileDestination() // log to default swiftybeaver.log file //let cloud = SBPlatformDestination(appID: "foo", appSecret: "bar", encryptionKey: "123") // to cloud // use custom format and set console output to short time, log level & message // console.format = "$DHH:mm:ss$d $L $M" // add the destinations to SwiftyBeaver JSLog.addDestination(console) //log.addDestination(file) //log.addDestination(cloud) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/Array+Extension.swift ================================================ // // Array+Extension.swift // BeeFun // // Created by WengHengcong on 2017/3/18. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension Array { /// 检查当前index是否超过数组边界 /// /// - Parameter index: <#index description#> /// - Returns: <#return value description#> func isBeyond(index: Int) -> Bool { if self.isEmpty { return true } if (index >= self.count) || ( index < 0) { return true } return false } /// Element at the given index if it exists. /// /// - Parameter index: index of element. /// - Returns: optional element (if exists). public func item(at index: Int) -> Element? { //~= 是模式匹配符号,即index是否在start...end之间 guard startIndex..) -> Array { let halfOpenClampedRange = Range(range).clamped(to: indices) return Array(self[halfOpenClampedRange]) } /// Returns a random element from the array. public func random() -> Element? { guard count > 0 else { return nil } let index = Int(arc4random_uniform(UInt32(count))) return self[index] } /// Checks if array contains at least 1 item which type is same with given element's type public func containsType(of element: T) -> Bool { let elementType = type(of: element) return contains { type(of: $0) == elementType} } /// Remove last element from array and return it. /// /// - Returns: last element in array (if applicable). @discardableResult public mutating func pop() -> Element? { return popLast() } /// Insert an element at the beginning of array. /// /// - Parameter newElement: element to insert. public mutating func prepend(_ newElement: Element) { insert(newElement, at: 0) } /// Insert an element to the end of array. /// /// - Parameter newElement: element to insert. public mutating func push(_ newElement: Element) { append(newElement) } /// Safely Swap values at index positions. /// /// - Parameters: /// - index: index of first element. /// - otherIndex: index of other element. public mutating func safeSwap(from index: Int, to otherIndex: Int) { guard index != otherIndex, startIndex.. Bool) rethrows -> Int? { for (index, value) in lazy.enumerated() { if try condition(value) { return index } } return nil } /// Get last index where condition is met. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: last index where the specified condition evaluates to true. (optional) public func lastIndex(where condition: (Element) throws -> Bool) rethrows -> Int? { for (index, value) in lazy.enumerated().reversed() { if try condition(value) { return index } } return nil } /// Get all indices where condition is met. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: all indices where the specified condition evaluates to true. (optional) public func indices(where condition: (Element) throws -> Bool) rethrows -> [Int]? { var indicies: [Int] = [] for (index, value) in lazy.enumerated() { if try condition(value) { indicies.append(index) } } return indicies.isEmpty ? nil : indicies } /// Check if all elements in array match a conditon. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: true when all elements in the array match the specified condition. public func all(matching condition: (Element) throws -> Bool) rethrows -> Bool { return try !contains { try !condition($0) } } /// Check if no elements in array match a conditon. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: true when no elements in the array match the specified condition. public func none(matching condition: (Element) throws -> Bool) rethrows -> Bool { return try !contains { try condition($0) } } /// Get last element that satisfies a conditon. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: the last element in the array matching the specified condition. (optional) public func last(where condition: (Element) throws -> Bool) rethrows -> Element? { for element in reversed() { if try condition(element) { return element } } return nil } /// Filter elements based on a rejection condition. /// /// - Parameter condition: to evaluate the exclusion of an element from the array. /// - Returns: the array with rejected values filtered from it. public func reject(where condition: (Element) throws -> Bool) rethrows -> [Element] { return try filter { return try !condition($0) } } /// Get element count based on condition. /// /// - Parameter condition: condition to evaluate each element against. /// - Returns: number of times the condition evaluated to true. public func count(where condition: (Element) throws -> Bool) rethrows -> Int { var count = 0 for element in self { if try condition(element) { count += 1 } } return count } /// Iterate over a collection in reverse order. (right to left) /// /// - Parameter body: a closure that takes an element of the array as a parameter. public func forEachReversed(_ body: (Element) throws -> Void) rethrows { try reversed().forEach { try body($0) } } /// Iterates on each element of the array with its index. (Index, Element) public func forEachEnumerated(_ body: @escaping (_ offset: Int, _ element: Element) -> Void) { enumerated().forEach(body) } /// Calls given closure with each element where condition is true. /// /// - Parameters: /// - condition: condition to evaluate each element against. /// - body: a closure that takes an element of the array as a parameter. public func forEach(where condition: (Element) throws -> Bool, body: (Element) throws -> Void) rethrows { for element in self where try condition(element) { try body(element) } } /// Reduces an array while returning each interim combination. /// /// - Parameters: /// - initial: initial value. /// - next: closure that combines the accumulating value and next element of the array. /// - Returns: an array of the final accumulated value and each interim combination. public func accumulate(initial: U, next: (U, Element) throws -> U) rethrows -> [U] { var runningTotal = initial return try map { element in runningTotal = try next(runningTotal, element) return runningTotal } } /// Filtered and map in a single operation. /// /// - Parameters: /// - isIncluded: condition of inclusion to evaluate each element against. /// - transform: transform element function to evaluate every element. /// - Returns: Return an filtered and mapped array. public func filtered(_ isIncluded: (Element) throws -> Bool, map transform: (Element) throws -> T) rethrows -> [T] { return try flatMap({ if try isIncluded($0) { return try transform($0) } return nil }) } /// Keep elements of Array while condition is true. /// /// - Parameter condition: condition to evaluate each element against. public mutating func keep(while condition: (Element) throws -> Bool) rethrows { for (index, element) in lazy.enumerated() { if try !condition(element) { self = Array(self[startIndex.. Bool) rethrows -> [Element] { for (index, element) in lazy.enumerated() { if try !condition(element) { return Array(self[startIndex.. Bool) rethrows -> [Element] { for (index, element) in lazy.enumerated() { if try !condition(element) { return Array(self[index.. Bool) -> Bool { return !contains { !body($0) } } /// Checks if all elements in the array are true or false public func testAll(is condition: Bool) -> Bool { return testAll { ($0 as? Bool) ?? !condition == condition } } } // MARK: - Methods (FloatingPoint) public extension Array where Element: FloatingPoint { /// Average of all elements in array. /// /// - Returns: average of the array's elements. public func average() -> Element { // http://stackoverflow.com/questions/28288148/making-my-function-calculate-average-of-array-swift return isEmpty ? 0 : reduce(0, +) / Element(count) } /// Sum of all elements in array. /// /// - Returns: sum of the array's elements. public func sum() -> Element { return reduce(0, +) } } // MARK: - Methods (Integer) public extension Array where Element: BinaryInteger { /// SwifterSwift: Sum of all elements in array. /// /// - Returns: sum of the array's elements. public func sum() -> Element { // http://stackoverflow.com/questions/28288148/making-my-function-calculate-average-of-array-swift return reduce(0, +) } } // MARK: - Methods (Equatable) extension Array where Element: Equatable { /// : Check if array contains an array of elements. /// /// - Parameter elements: array of elements to check. /// - Returns: true if array contains all given items. public func contains(_ elements: [Element]) -> Bool { guard !elements.isEmpty else { // elements array is empty return true } var found = true for element in elements { if !contains(element) { found = false } } return found } // /// EZSE: Checks if the main array contains the parameter array // public func contains(_ array: [Element]) -> Bool { // return array.testAll { self.index(of: $0) ?? -1 >= 0 } // } /// Checks if self contains a list of items. public func contains(_ elements: Element...) -> Bool { return elements.testAll { self.index(of: $0) ?? -1 >= 0 } } /// : All indexes of specified item. /// /// - Parameter item: item to check. /// - Returns: an array with all indexes of the given item. public func indexes(of item: Element) -> [Int] { var indexes: [Int] = [] for index in startIndex.. [Element] { // Thanks to https://github.com/sairamkotha for improving the property return reduce([]) { ($0 as [Element]).contains($1) ? $0 : $0 + [$1] } } /// : First index of a given item in an array. /// /// - Parameter item: item to check. /// - Returns: first index of item in array (if exists). public func firstIndex(of item: Element) -> Int? { for (index, value) in lazy.enumerated() where value == item { return index } return nil } /// : Last index of element in array. /// /// - Parameter item: item to check. /// - Returns: last index of item in array (if exists). public func lastIndex(of item: Element) -> Int? { for (index, value) in lazy.enumerated().reversed() where value == item { return index } return nil } /// EZSE: Difference of self and the input arrays. public func difference(_ values: [Element]...) -> [Element] { var result = [Element]() elements: for element in self { for value in values { // if a value is in both self and one of the values arrays // jump to the next iteration of the outer loop if value.contains(element) { continue elements } } // element it's only in self result.append(element) } return result } /// EZSE: Intersection of self and the input arrays. public func intersection(_ values: [Element]...) -> Array { var result = self var intersection = Array() for (i, value) in values.enumerated() { // the intersection is computed by intersecting a couple per loop: // self n values[0], (self n values[0]) n values[1], ... if i > 0 { result = intersection intersection = Array() } // find common elements and save them in first set // to intersect in the next loop value.forEach { (item: Element) -> Void in if result.contains(item) { intersection.append(item) } } } return intersection } /// EZSE: Union of self and the input arrays. public func union(_ values: [Element]...) -> Array { var result = self for array in values { for value in array { if !result.contains(value) { result.append(value) } } } return result } /// EZSE: Returns an array consisting of the unique elements in the array public func unique() -> Array { return reduce([]) { $0.contains($1) ? $0 : $0 + [$1] } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/Bundle+Extension.swift ================================================ // // Bundle+Extension.swift // BeeFun // // Created by WengHengcong on 2017/3/19. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension Bundle { /// 中文Bundle class var cnBundle: Bundle { return langBundle(kChineseLanguage) } /// 英文Bundle class var enBundle: Bundle { return langBundle(kEnglishLanguage) } /// APP语言Bundle class var appBundle: Bundle { let appLang = JSLanguage.appLanguage return langBundle(appLang) } /// 根据语言返回Bundle /// /// - Parameter language: <#language description#> /// - Returns: <#return value description#> class func langBundle(_ language: String) -> Bundle { if language.isEmpty { return Bundle.main } else { if let pathR = Bundle.main.path(forResource: language, ofType: "lproj") { let bundle = Bundle(path: pathR)! return bundle } else { return Bundle.main } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/Character+Extension.swift ================================================ // // Character+Extension.swift // BeeFun // // Created by WengHengcong on 24/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit // MARK: - Properties public extension Character { /// SwifterSwift: Check if character is emoji. public var isEmoji: Bool { // http://stackoverflow.com/questions/30757193/find-out-if-character-in-string-is-emoji let scalarValue = String(self).unicodeScalars.first!.value switch scalarValue { case 0x3030, 0x00AE, 0x00A9,// Special Characters 0x1D000...0x1F77F, // Emoticons 0x2100...0x27BF, // Misc symbols and Dingbats 0xFE00...0xFE0F, // Variation Selectors 0x1F900...0x1F9FF: // Supplemental Symbols and Pictographs return true default: return false } } /// SwifterSwift: Check if character is number. public var isNumber: Bool { return Int(String(self)) != nil } /// SwifterSwift: Check if character is a letter. public var isLetter: Bool { return String(self).hasLetters } /// SwifterSwift: Check if character is uppercased. public var isUppercased: Bool { return String(self) == String(self).uppercased() } /// SwifterSwift: Check if character is lowercased. public var isLowercased: Bool { return String(self) == String(self).lowercased() } /// SwifterSwift: Check if character is white space. public var isWhiteSpace: Bool { return String(self) == " " } /// SwifterSwift: Integer from character (if applicable). public var int: Int? { return Int(String(self)) } /// SwifterSwift: String from character. public var string: String { return String(self) } /// SwifterSwift: Return the character lowercased. public var lowercased: Character { return String(self).lowercased().first! } /// SwifterSwift: Return the character uppercased. public var uppercased: Character { return String(self).uppercased().first! } } // MARK: - Operators public extension Character { /// SwifterSwift: Repeat character multiple times. /// /// - Parameters: /// - lhs: character to repeat. /// - rhs: number of times to repeat character. /// - Returns: string with character repeated n times. public static func * (lhs: Character, rhs: Int) -> String { guard rhs > 0 else { return "" } return String(repeating: String(lhs), count: rhs) } /// SwifterSwift: Repeat character multiple times. /// /// - Parameters: /// - lhs: number of times to repeat character. /// - rhs: character to repeat. /// - Returns: string with character repeated n times. public static func * (lhs: Int, rhs: Character) -> String { guard lhs > 0 else { return "" } return String(repeating: String(rhs), count: lhs) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/Data+Extension.swift ================================================ // // Data+Extension.swift // LoveYou // // Created by WengHengcong on 2017/3/14. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension Data { /// 返回Data的String var string: String? { return String(data:self, encoding: String.Encoding.utf8) } } #if os(macOS) import Cocoa #else import UIKit #endif // MARK: - Methods public extension Data { /// SwifterSwift: String by encoding Data using the given encoding (if applicable). /// /// - Parameter encoding: encoding. /// - Returns: String by encoding Data using the given encoding (if applicable). public func string(encoding: String.Encoding) -> String? { return String(data: self, encoding: encoding) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/Dictionary+Extension.swift ================================================ // // Dictionary+Extension.swift // BeeFun // // Created by WengHengcong on 24/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit // MARK: - Methods public extension Dictionary { /// SwifterSwift: Check if key exists in dictionary. /// /// - Parameter key: key to search for /// - Returns: true if key exists in dictionary. public func has(_ key: Key) -> Bool { return index(forKey: key) != nil } /// SwifterSwift: Remove all keys of the dictionary. /// /// - Parameter keys: keys to be removed public mutating func removeAll(keys: [Key]) { keys.forEach({ removeValue(forKey: $0)}) } /// SwifterSwift: JSON Data from dictionary. /// /// - Parameter prettify: set true to prettify data (default is false). /// - Returns: optional JSON Data (if applicable). public func jsonData(prettify: Bool = false) -> Data? { guard JSONSerialization.isValidJSONObject(self) else { return nil } let options = (prettify == true) ? JSONSerialization.WritingOptions.prettyPrinted : JSONSerialization.WritingOptions() return try? JSONSerialization.data(withJSONObject: self, options: options) } /// SwifterSwift: JSON String from dictionary. /// /// - Parameter prettify: set true to prettify string (default is false). /// - Returns: optional JSON String (if applicable). public func jsonString(prettify: Bool = false) -> String? { guard JSONSerialization.isValidJSONObject(self) else { return nil } let options = (prettify == true) ? JSONSerialization.WritingOptions.prettyPrinted : JSONSerialization.WritingOptions() let jsonData = try? JSONSerialization.data(withJSONObject: self, options: options) return jsonData?.string(encoding: .utf8) } } // MARK: - Operators public extension Dictionary { /// SwifterSwift: Merge the keys/values of two dictionaries. /// /// - Parameters: /// - lhs: dictionary /// - rhs: dictionary /// - Returns: An dictionary with keys and values from both. public static func + (lhs: [Key: Value], rhs: [Key: Value]) -> [Key: Value] { var result = lhs rhs.forEach{ result[$0] = $1 } return result } // MARK: - Operators /// EZSE: Combines the first dictionary with the second and returns single dictionary static public func += (left: inout [KeyType: ValueType], right: [KeyType: ValueType]) { for (k, v) in right { left.updateValue(v, forKey: k) } } /// EZSE: Difference operator static public func - (first: [K: V], second: [K: V]) -> [K: V] { return first.difference(second) } /// SwifterSwift: Remove contained in the array from the dictionary /// /// - Parameters: /// - lhs: dictionary /// - rhs: array with the keys to be removed. /// - Returns: a new dictionary with keys removed. public static func - (first: [Key: Value], second: [Key]) -> [Key: Value] { var result = first result.removeAll(keys: second) return result } /// SwifterSwift: Remove contained in the array from the dictionary /// /// - Parameters: /// - lhs: dictionary /// - rhs: array with the keys to be removed. public static func -= (first: inout [Key: Value], second: [Key]) { first.removeAll(keys: second) } /// EZSE: Returns the value of a random Key-Value pair from the Dictionary public func random() -> Value? { return Array(values).random() } /// EZSE: Union of self and the input dictionaries. public func union(_ dictionaries: Dictionary...) -> Dictionary { var result = self dictionaries.forEach { (dictionary) -> Void in dictionary.forEach { (key, value) -> Void in result[key] = value } } return result } /// EZSE: Creates an Array with values generated by running /// each [key: value] of self through the mapFunction. public func toArray(_ map: (Key, Value) -> V) -> [V] { return self.map(map) } /// EZSE: Creates a Dictionary with the same keys as self and values generated by running /// each [key: value] of self through the mapFunction. public func mapValues(_ map: (Key, Value) -> V) -> [Key: V] { var mapped: [Key: V] = [:] forEach { mapped[$0] = map($0, $1) } return mapped } /// EZSE: Creates a Dictionary with the same keys as self and values generated by running /// each [key: value] of self through the mapFunction discarding nil return values. public func mapFilterValues(_ map: (Key, Value) -> V?) -> [Key: V] { var mapped: [Key: V] = [:] forEach { if let value = map($0, $1) { mapped[$0] = value } } return mapped } /// EZSE: Creates a Dictionary with keys and values generated by running /// each [key: value] of self through the mapFunction discarding nil return values. public func mapFilter(_ map: (Key, Value) -> (K, V)?) -> [K: V] { var mapped: [K: V] = [:] forEach { if let value = map($0, $1) { mapped[value.0] = value.1 } } return mapped } /// EZSE: Creates a Dictionary with keys and values generated by running /// each [key: value] of self through the mapFunction. public func map(_ map: (Key, Value) -> (K, V)) -> [K: V] { var mapped: [K: V] = [:] forEach { let (_key, _value) = map($0, $1) mapped[_key] = _value } return mapped } /// EZSE: Constructs a dictionary containing every [key: value] pair from self /// for which testFunction evaluates to true. public func filter(_ test: (Key, Value) -> Bool) -> Dictionary { var result = Dictionary() for (key, value) in self { if test(key, value) { result[key] = value } } return result } /// EZSE: Checks if test evaluates true for all the elements in self. public func testAll(_ test: (Key, Value) -> (Bool)) -> Bool { return !contains { !test($0, $1) } } /// EZSE: Unserialize JSON string into Dictionary public static func constructFromJSON (json: String) -> Dictionary? { if let data = (try? JSONSerialization.jsonObject(with: json.data(using: String.Encoding.utf8, allowLossyConversion: true)!, options: JSONSerialization.ReadingOptions.mutableContainers)) as? Dictionary { return data } else { return nil } } /// EZSE: Serialize Dictionary into JSON string public func formatJSON() -> String? { if let jsonData = try? JSONSerialization.data(withJSONObject: self, options: JSONSerialization.WritingOptions()) { let jsonStr = String(data: jsonData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) return String(jsonStr ?? "") } return nil } } extension Dictionary where Value: Equatable { /// EZSE: Difference of self and the input dictionaries. /// Two dictionaries are considered equal if they contain the same [key: value] pairs. public func difference(_ dictionaries: [Key: Value]...) -> [Key: Value] { var result = self for dictionary in dictionaries { for (key, value) in dictionary { if result.has(key) && result[key] == value { result.removeValue(forKey: key) } } } return result } } // MARK: - Methods (ExpressibleByStringLiteral) public extension Dictionary where Key: ExpressibleByStringLiteral { /// SwifterSwift: Lowercase all keys in dictionary. public mutating func lowercaseAllKeys() { // http://stackoverflow.com/questions/33180028/extend-dictionary-where-key-is-of-type-string for key in keys { if let lowercaseKey = String(describing: key).lowercased() as? Key { self[lowercaseKey] = removeValue(forKey: key) } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/DispatchQueue+Extension.swift ================================================ // // DispatchQueue+Extension.swift // BeeFun // // Created by WengHengcong on 24/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit // MARK: - dispatch once /* example: DispatchQueue.once { setupUI() } DispatchQueue.once(token: "com.me.project") { setupUI() } */ public extension DispatchQueue { private static var _onceTracker = [String]() public class func once(file: String = #file, function: String = #function, line: Int = #line, block: ()-> Void) { let token = file + ":" + function + ":" + String(line) once(token: token, block: block) } /** Executes a block of code, associated with a unique token, only once. The code is thread safe and will only execute the code once even in the presence of multithreaded calls. - parameter token: A unique reverse DNS style name such as com.vectorform. or a GUID - parameter block: Block to execute once */ public class func once(token: String, block: ()-> Void) { objc_sync_enter(self) defer { objc_sync_exit(self) } if _onceTracker.contains(token) { return } _onceTracker.append(token) block() } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSApp.swift ================================================ // // JSAppVersion.swift // LoveYou // // Created by WengHengcong on 2016/10/28. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSApp: NSObject { /// 应用APPID static var UnKnown: String = "Unknown" static var appId: String = UnKnown static var appStoreLink: String = UnKnown /// 应用版本 class var appVersion: String { return getAppVersion() } /// 编译版本 class var buildVersion: String { return getBuildVersion() } /// info dictionary class var infoDictionary: [String: Any] { return getInfoDictionary() } /// display name class var displayName: String { return getAppDisplayName() } /// name class var name: String { return getAppName() } /// bundle identifier class var bundleIdentifier: String { return getAppBudleIndetifier() } /// 获取infoplist中的设置 /// /// - Returns: infoDictionary class func getInfoDictionary() -> [String: Any] { var info = Bundle.appBundle.infoDictionary if info == nil || (info?.isEmpty)! { info = Bundle.main.infoDictionary! } if info == nil || (info?.isEmpty)! { info = Bundle.main.localizedInfoDictionary! } return info! } /// 应用版本 /// 标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数代表重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特点。第三个整数代表维护版本。 /// - returns: CFBundleShortVersionString public class func getAppVersion() -> String { let release = JSApp.infoDictionary["CFBundleShortVersionString"] as? String if let ver = release { return ver } return "1.0" } /// 编译版本 /// 标识(发布或未发布)的内部版本号。这是一个单调增加的字符串,包括一个或多个时期分隔的整数 /// - returns: CFBundleVersion public class func getBuildVersion() -> String { let build = JSApp.infoDictionary["CFBundleVersion"] as? String if let ver = build { return ver } return "1" } /// 获取APP显示名 /// /// - Returns: CFBundleDisplayName public class func getAppDisplayName() -> String { let displayName = JSApp.infoDictionary["CFBundleDisplayName"] as? String return displayName ?? " " } /// 获取APP Name /// /// - Returns: CFBundleName public class func getAppName() -> String { let appName = JSApp.infoDictionary["CFBundleName"] as? String return appName ?? "" } /// 获取APP Bundle Identifier /// /// - Returns: CFBundleIdentifier public class func getAppBudleIndetifier() -> String { let appName = JSApp.infoDictionary["CFBundleIdentifier"] as? String return appName ?? "" } /// 评价APP public class func rateUs() { if appId == UnKnown { appId = AppleAppID } let appstroreUrl = ("itms-apps://itunes.apple.com/app/id\(appId)") UIApplication.shared.openURL( URL(string: appstroreUrl)! ) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSAssociatedObject.swift ================================================ // // JSAssociatedObject.swift // BeeFun // // Created by WengHengcong on 2017/4/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit final class Lifted { let value: T init(_ x: T) { value = x } } private func lift(x: T) -> Lifted { return Lifted(x) } func setAssociatedObject(object: AnyObject, value: T, associativeKey: UnsafeRawPointer, policy: objc_AssociationPolicy) { if let v: AnyObject = value as? AnyObject { objc_setAssociatedObject(object, associativeKey, v, policy) } else { objc_setAssociatedObject(object, associativeKey, lift(x: value), policy) } } func getAssociatedObject(object: AnyObject, associativeKey: UnsafeRawPointer) -> T? { if let v = objc_getAssociatedObject(object, associativeKey) as? T { return v } else if let v = objc_getAssociatedObject(object, associativeKey) as? Lifted { return v.value } else { return nil } } class JSAssociatedObject: NSObject { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSClass.swift ================================================ // // JSClass.swift // LoveYou // // Created by WengHengcong on 2017/2/27. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSClass { /// crate class from class name of string /// /// - Parameter className: string type /// - Returns: the class class func from(_ name: String) -> AnyClass! { let className = JSApp.getAppName() + "." + name return NSClassFromString(className) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSDebug.swift ================================================ // // JSDebug.swift // BeeFun // // Created by WengHengcong on 2017/4/16. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSDebug: NSObject { class var function: String { let fuc = #function return fuc } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSFoundation.swift ================================================ // // JSFoundation.swift // BeeFun // // Created by WengHengcong on 2017/3/18. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSFoundation: NSObject { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSFoundationGlobal.swift ================================================ // // JSFoundationGloable.swift // BeeFun // // Created by WengHengcong on 2017/3/18. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSFoundationGlobal: NSObject { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSGCD.swift ================================================ // // JSGCD.swift // BeeFun // // Created by WengHengcong on 2017/4/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSGCD: NSObject { func delay(_ delay: Double, closure:@escaping () -> Void) { let when = DispatchTime.now() + delay DispatchQueue.main.asyncAfter(deadline: when, execute: closure) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSLanguage.swift ================================================ // // JSLanguage.swift // BeeFun // // Created by WengHengcong on 2017/3/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// 这个key不能修改 let kAppleLanguageKey = "AppleLanguages" /// 用户选择的语言 let kAppUserLanguageKey = "kAppUserLanguageKey" /// 语言管理类,分为系统语言、APP语言、用户选择语言 class JSLanguage: NSObject { /// 获取系统的两位语言代码 class var languageCode: String { return Locale.current.languageCode! } /// 获取两位区域代码 class var regionCode: String { return Locale.current.regionCode! } /// 获取系统的语言 class var systemLanguage: String { //NSLocale.preferredLanguages.first获取到的仍然是app内设置的语言选择 // let system = NSLocale.preferredLanguages.first! var system = languageCode if system.contains("zh") { system = kChineseLanguage } else if system.contains("en") { system = kEnglishLanguage } else { system = kEnglishLanguage } return system } /// 用户选择的语言,默认是系统的语言 class var userLanguage: String? { set { let def = UserDefaults.standard def.set(newValue, forKey: kAppUserLanguageKey) def.synchronize() } get { let def = UserDefaults.standard let choose = def.object(forKey: kAppUserLanguageKey) return choose as? String } } /// APP语言 class var appLanguage: String { set { let def = UserDefaults.standard def.set([newValue], forKey: kAppleLanguageKey) def.synchronize() } get { let def = UserDefaults.standard let langArray = def.object(forKey: kAppleLanguageKey) as? NSArray var current = kEnglishLanguage if let lan = langArray?.firstObject as? String { current = lan if current.contains("zh") { current = kChineseLanguage } else if current.contains("en") { current = kEnglishLanguage } else { current = kEnglishLanguage } } return current } } /// 设置用户选择语言 class func switchLanguage(to lang: String) { userLanguage = lang } /// 将用户选择的语言同步到App语言 class func synchronize() { appLanguage = userLanguage! } /// 初始化语言,默认为系统的语言 class func initUserLanguage() { if userLanguage == nil { userLanguage = systemLanguage } synchronize() } /// 设置APP语言为英文语言 class func setEnglish() { userLanguage = kEnglishLanguage } /// 设置APP语言为中文语言 class func setChinese() { userLanguage = kChineseLanguage } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSObject.swift ================================================ // // JSObject.swift // LoveYou // // Created by WengHengcong on 2017/2/27. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class JSObject: NSObject, Mappable { var version: Int? override init() { super.init() version = 1 } required init?(map: Map) { } // Mappable func mapping(map: Map) { version <- map["version"] } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/JSUtilis.swift ================================================ // // JSUtilis.swift // BeeFun // // Created by WengHengcong on 05/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/NSAttributedString+Size.swift ================================================ // // NSAttributedString+Size.swift // LoveYou // // Created by WengHengcong on 2017/3/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension NSAttributedString { func height(with width: CGFloat) -> CGFloat { let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil) return boundingBox.height } func width(with height: CGFloat) -> CGFloat { let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height) let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil) return boundingBox.width } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/NSObject+Extension.swift ================================================ // // NSObject+Extension.swift // BeeFun // // Created by WengHengcong on 2017/4/13. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension NSObject { var className: String { return String(describing: type(of: self)) } class var className: String { return String(describing: self) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/NSString+Size.swift ================================================ // // String+Size.swift // LoveYou // // Created by WengHengcong on 2017/3/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import Foundation extension NSString { // FIXME: 为什么无效??? /// 返回文本高度 /// /// - Parameters: /// - width: 文本占宽 /// - font: 文本字体 /// - Returns: 文本高度 func height(with width: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width:width, height:.greatestFiniteMagnitude) let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil) return boundingBox.height } /// 返回文本宽度 /// /// - Parameters: /// - height: 文本占高 /// - font: 文本字体 /// - Returns: 文本宽度 func width(with height: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height) let attributes = [NSAttributedString.Key.font: font] let option = NSStringDrawingOptions.usesLineFragmentOrigin let boundingBox = boundingRect(with: constraintRect, options: option, attributes: attributes, context: nil) return boundingBox.width } } extension String { /// 返回文本高度 /// /// - Parameters: /// - width: 文本占宽 /// - font: 文本字体 /// - Returns: 文本高度 func height(with width: CGFloat, font: UIFont) -> CGFloat { let calString = self as NSString return calString.height(with: width, font: font) } /// 返回文本宽度 /// /// - Parameters: /// - height: 文本占高 /// - font: 文本字体 /// - Returns: 文本宽度 func width(with height: CGFloat, font: UIFont) -> CGFloat { let calString = self as NSString return calString.width(with: height, font: font) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/README.md ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSFoundation/String+Extension.swift ================================================ // // String+Extension.swift // LoveYou // // Created by WengHengcong on 2017/3/12. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit // MARK: - Localized extension String { //http://stackoverflow.com/questions/25081757/whats-nslocalizedstring-equivalent-in-swift //https://github.com/nixzhu/dev-blog/blob/master/2014-04-24-internationalization-tutorial-for-ios-2014.md /// 获取APP语言字符串 var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.appBundle, value: "", comment: "") } /// 获取英文国际化字符串 var enLocalized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.enBundle, value: "", comment: "") } /// 获取中文国际化字符串 var cnLocalized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.cnBundle, value: "", comment: "") } /// 获取APP语言字符串 func localized(withComment: String) -> String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.appBundle, value: "", comment: withComment) } /// 获取英文国际化字符串 func enLocalized(withComment: String) -> String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.enBundle, value: "", comment: withComment) } /// 获取中文国际化字符串 func cnLocalized(withComment: String) -> String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.cnBundle, value: "", comment: withComment) } } // MARK: - count extension String { /// 字符串长度 var length: Int { return self.count } /// 按UTF16标准的字符串长度 var utf16Length: Int { return self.utf16.count } // MARK: - index /// 返回Index类型 /// /// - Parameter from: <#from description#> /// - Returns: <#return value description#> func index(from: Int) -> Index { return self.index(startIndex, offsetBy: from) } } // MARK: - substring extension String { //http://stackoverflow.com/questions/39677330/how-does-string-substring-work-in-swift-3 /// 裁剪字符串from /// /// - Parameter from: <#from description#> /// - Returns: <#return value description#> func substring(from: Int) -> String { let fromIndex = index(from: from) return substring(from: fromIndex) } /// 裁剪字符串to /// /// - Parameter to: <#to description#> /// - Returns: <#return value description#> func substring(to: Int) -> String { let toIndex = index(from: to) return substring(to: toIndex) } /// 裁剪字符串range /// /// - Parameter r: <#r description#> /// - Returns: <#return value description#> func substring(with r: Range) -> String { let startIndex = index(from: r.lowerBound) let endIndex = index(from: r.upperBound) return substring(with: startIndex.. static func randomCharsNums(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" return random(length: length, letters: letters) } /// 随机字符串,只包含大小写字母 /// /// - Parameter length: 长度应小于52 /// - Returns: <#return value description#> static func randomChars(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" return random(length: length, letters: letters) } /// 随机字符串,只包含数字 /// /// - Parameter length: 长度应小于10 static func randomNums(length: Int) -> String { let letters = "0123456789" return random(length: length, letters: letters) } /// 随机字符串 /// /// - Parameters: /// - length: 生成的字符串长度 /// - letters: 用语生成随机字符串的字符串数据集 /// - Returns: <#return value description#> static func random(length: Int, letters: String) -> String { let len = UInt32(letters.length) var randomString = "" for _ in 0 ..< length { let rand = arc4random_uniform(len) let nextCharIndex = letters.index(letters.startIndex, offsetBy: Int(rand)) let nextChar = String(letters[nextCharIndex]) randomString += nextChar } return randomString } } #if os(macOS) import Cocoa #else import UIKit #endif // MARK: - Properties public extension String { /// SwifterSwift: String decoded from base64 (if applicable). public var base64Decoded: String? { // https://github.com/Reza-Rg/Base64-Swift-Extension/blob/master/Base64.swift guard let decodedData = Data(base64Encoded: self) else { return nil } return String(data: decodedData, encoding: .utf8) } /// SwifterSwift: String encoded in base64 (if applicable). public var base64Encoded: String? { // https://github.com/Reza-Rg/Base64-Swift-Extension/blob/master/Base64.swift let plainData = data(using: .utf8) return plainData?.base64EncodedString() } /// SwifterSwift: Array of self of a string. public var charactersArray: [Character] { return Array(self) } /// SwifterSwift: CamelCase of string. public var camelCased: String { let source = lowercased() if source.contains(" ") { let first = source.substring(to: source.index(after: source.startIndex)) let camel = source.capitalized.replacing(" ", with: "").replacing("\n", with: "") let rest = String(camel.dropFirst()) return first + rest } let first = source.lowercased().substring(to: source.index(after: source.startIndex)) let rest = String(source.dropFirst()) return first + rest } /// SwifterSwift: Check if string contains one or more emojis. public var containEmoji: Bool { // http://stackoverflow.com/questions/30757193/find-out-if-character-in-string-is-emoji for scalar in unicodeScalars { switch scalar.value { case 0x3030, 0x00AE, 0x00A9, // Special Characters 0x1D000...0x1F77F, // Emoticons 0x2100...0x27BF, // Misc symbols and Dingbats 0xFE00...0xFE0F, // Variation Selectors 0x1F900...0x1F9FF: // Supplemental Symbols and Pictographs return true default: continue } } return false } /// SwifterSwift: First character of string (if applicable). public var firstCharacter: String? { guard let first = self.first else { return nil } return String(first) } /// SwifterSwift: Check if string contains one or more letters. public var hasLetters: Bool { return rangeOfCharacter(from: .letters, options: .numeric, range: nil) != nil } /// SwifterSwift: Check if string contains one or more numbers. public var hasNumbers: Bool { return rangeOfCharacter(from: .decimalDigits, options: .literal, range: nil) != nil } /// SwifterSwift: Check if string contains only letters. public var isAlphabetic: Bool { return hasLetters && !hasNumbers } /// SwifterSwift: Check if string contains at least one letter and one number. public var isAlphaNumeric: Bool { return components(separatedBy: CharacterSet.alphanumerics).joined(separator: "").count == 0 && hasLetters && hasNumbers } /// SwifterSwift: Check if string is valid email format. public var isEmail: Bool { // http://stackoverflow.com/questions/25471114/how-to-validate-an-e-mail-address-in-swift return matches(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}") } /// SwifterSwift: Check if string is a valid URL. public var isValidUrl: Bool { return URL(string: self) != nil } /// SwifterSwift: Check if string is a valid schemed URL. public var isValidSchemedUrl: Bool { guard let url = URL(string: self) else { return false } return url.scheme != nil } /// SwifterSwift: Check if string is a valid https URL. public var isValidHttpsUrl: Bool { guard let url = URL(string: self) else { return false } return url.scheme == "https" } /// SwifterSwift: Check if string is a valid http URL. public var isValidHttpUrl: Bool { guard let url = URL(string: self) else { return false } return url.scheme == "http" } /// SwifterSwift: Check if string contains only numbers. public var isNumeric: Bool { return !hasLetters && hasNumbers } /// Check if string contains only digits. public var isOnlyNumeric: Bool { //remove . symbol ,because some number written "1,000" or "1,000,000" let removeDot = self.replacing(",", with: "") let onlyDigits: CharacterSet = CharacterSet.decimalDigits.inverted if removeDot.rangeOfCharacter(from: onlyDigits) == nil { // String only consist digits 0-9 return true } return false } /// SwifterSwift: Last character of string (if applicable). public var lastCharacter: String? { guard let last = self.last else { return nil } return String(last) } /// SwifterSwift: Latinized string. public var latinized: String { return folding(options: .diacriticInsensitive, locale: Locale.current) } /// SwifterSwift: Array of strings separated by new lines. public var lines: [String] { var result = [String]() enumerateLines { line, _ in result.append(line) } return result } /// SwifterSwift: The most common character in string. public var mostCommonCharacter: String { let mostCommon = withoutSpacesAndNewLines.reduce([Character: Int]()) { var counts = $0 counts[$1] = ($0[$1] ?? 0) + 1 return counts }.max { $0.1 < $1.1 }?.0 return mostCommon?.string ?? "" } /// SwifterSwift: Reversed string. public var reversed: String { return String(self.reversed()) } /// SwifterSwift: Bool value from string (if applicable). public var bool: Bool? { let selfLowercased = trimmed.lowercased() switch selfLowercased { case "True", "true", "yes", "1": return true case "False", "false", "no", "0": return false default: return nil } } /// SwifterSwift: Date object from "yyyy-MM-dd" formatted string public var date: Date? { let selfLowercased = trimmed.lowercased() let formatter = DateFormatter() formatter.timeZone = TimeZone.current formatter.dateFormat = "yyyy-MM-dd" return formatter.date(from: selfLowercased) } /// SwifterSwift: Date object from "yyyy-MM-dd HH:mm:ss" formatted string. public var dateTime: Date? { let selfLowercased = trimmed.lowercased() let formatter = DateFormatter() formatter.timeZone = TimeZone.current formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" return formatter.date(from: selfLowercased) } /// SwifterSwift: Double value from string (if applicable). public var double: Double? { let formatter = NumberFormatter() return formatter.number(from: self) as? Double } /// SwifterSwift: Float value from string (if applicable). public var float: Float? { let formatter = NumberFormatter() return formatter.number(from: self) as? Float } /// SwifterSwift: Float32 value from string (if applicable). public var float32: Float32? { let formatter = NumberFormatter() return formatter.number(from: self) as? Float32 } /// SwifterSwift: Float64 value from string (if applicable). public var float64: Float64? { let formatter = NumberFormatter() return formatter.number(from: self) as? Float64 } /// SwifterSwift: Integer value from string (if applicable). public var int: Int? { return Int(self) } /// SwifterSwift: Int16 value from string (if applicable). public var int16: Int16? { return Int16(self) } /// SwifterSwift: Int32 value from string (if applicable). public var int32: Int32? { return Int32(self) } /// SwifterSwift: Int64 value from string (if applicable). public var int64: Int64? { return Int64(self) } /// SwifterSwift: Int8 value from string (if applicable). public var int8: Int8? { return Int8(self) } /// SwifterSwift: URL from string (if applicable). public var url: URL? { return URL(string: self) } /// SwifterSwift: String with no spaces or new lines in beginning and end. public var trimmed: String { return trimmingCharacters(in: .whitespacesAndNewlines) } /// SwifterSwift: Array with unicodes for all self in a string. public var unicodeArray: [Int] { return unicodeScalars.map({$0.hashValue}) } /// SwifterSwift: Readable string from a URL string. public var urlDecoded: String { return removingPercentEncoding ?? self } /// SwifterSwift: URL escaped string. public var urlEncoded: String { return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! } /// SwifterSwift: String without spaces and new lines. public var withoutSpacesAndNewLines: String { return replacing(" ", with: "").replacing("\n", with: "") } } // MARK: - Methods public extension String { /// SwifterSwift: Safely subscript string with index. /// /// - Parameter i: index. public subscript(i: Int) -> String? { guard i >= 0 && i < self.count else { return nil } return String(self[index(startIndex, offsetBy: i)]) } #if os(iOS) || os(macOS) /// SwifterSwift: Copy string to global pasteboard. public func copyToPasteboard() { #if os(iOS) UIPasteboard.general.string = self #elseif os(macOS) NSPasteboard.general().clearContents() NSPasteboard.general().setString(self, forType: NSPasteboardTypeString) #endif } #endif /// SwifterSwift: Converts string format to CamelCase. public mutating func camelize() { self = camelCased } /// SwifterSwift: Check if string contains one or more instance of substring. /// /// - Parameters: /// - string: substring to search for. /// - caseSensitive: set true for case sensitive search (default is true). /// - Returns: true if string contains one or more instance of substring. public func contains(_ string: String, caseSensitive: Bool = true) -> Bool { if !caseSensitive { return range(of: string, options: .caseInsensitive) != nil } return range(of: string) != nil } /// SwifterSwift: Count of substring in string. /// /// - Parameters: /// - string: substring to search for. /// - caseSensitive: set true for case sensitive search (default is true). /// - Returns: count of appearance of substring in string. public func count(of string: String, caseSensitive: Bool = true) -> Int { if !caseSensitive { return lowercased().components(separatedBy: string.lowercased()).count - 1 } return components(separatedBy: string).count - 1 } /// SwifterSwift: Check if string ends with substring. /// /// - Parameters: /// - suffix: substring to search if string ends with. /// - caseSensitive: set true for case sensitive search (default is true). /// - Returns: true if string ends with substring. public func ends(with suffix: String, caseSensitive: Bool = true) -> Bool { if !caseSensitive { return lowercased().hasSuffix(suffix.lowercased()) } return hasSuffix(suffix) } /// SwifterSwift: First index of substring in string. /// /// - Parameter string: substring to search for. /// - Returns: first index of substring in string (if applicable). public func firstIndex(of string: String) -> Int? { return Array(self).map({String($0)}).index(of: string) } /// SwifterSwift: Latinize string. public mutating func latinize() { self = latinized } /// SwifterSwift: String by replacing part of string with another string. /// /// - Parameters: /// - substring: old substring to find and replace. /// - newString: new string to insert in old string place. /// - Returns: string after replacing substring with newString. public func replacing(_ substring: String, with newString: String) -> String { return replacingOccurrences(of: substring, with: newString) } /// SwifterSwift: Reverse string. public mutating func reverse() { self = String(self.reversed()) } /// SwifterSwift: Array of strings separated by given string. /// /// - Parameter separator: separator to split string by. /// - Returns: array of strings separated by given string. public func splitted(by separator: Character) -> [String] { return self.split{$0 == separator}.map(String.init) } /// SwifterSwift: Check if string starts with substring. /// /// - Parameters: /// - suffix: substring to search if string starts with. /// - caseSensitive: set true for case sensitive search (default is true). /// - Returns: true if string starts with substring. public func starts(with prefix: String, caseSensitive: Bool = true) -> Bool { if !caseSensitive { return lowercased().hasPrefix(prefix.lowercased()) } return hasPrefix(prefix) } /// SwifterSwift: Date object from string of date format. /// /// - Parameter format: date format. /// - Returns: Date object from string (if applicable). public func date(withFormat format: String) -> Date? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = format return dateFormatter.date(from: self) } /// SwifterSwift: Removes spaces and new lines in beginning and end of string. public mutating func trim() { self = trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) } /// SwifterSwift: Truncate string (cut it to a given number of self). /// /// - Parameters: /// - toLength: maximum number of self before cutting. /// - trailing: string to add at the end of truncated string (default is "..."). public mutating func truncate(toLength: Int, trailing: String? = "...") { guard toLength > 0 else { return } if self.count > toLength { self = substring(to: index(startIndex, offsetBy: toLength)) + (trailing ?? "") } } /// SwifterSwift: Truncated string (limited to a given number of self). /// /// - Parameters: /// - toLength: maximum number of self before cutting. /// - trailing: string to add at the end of truncated string. /// - Returns: truncated string (this is an extr...). public func truncated(toLength: Int, trailing: String? = "...") -> String { guard 1.. Bool { return range(of: pattern, options: String.CompareOptions.regularExpression, range: nil, locale: nil) != nil } } // MARK: - Operators public extension String { /// SwifterSwift: Repeat string multiple times. /// /// - Parameters: /// - lhs: string to repeat. /// - rhs: number of times to repeat character. /// - Returns: new string with given string repeated n times. public static func * (lhs: String, rhs: Int) -> String { guard rhs > 0 else { return "" } return String(repeating: lhs, count: rhs) } /// SwifterSwift: Repeat string multiple times. /// /// - Parameters: /// - lhs: number of times to repeat character. /// - rhs: string to repeat. /// - Returns: new string with given string repeated n times. public static func * (lhs: Int, rhs: String) -> String { guard lhs > 0 else { return "" } return String(repeating: rhs, count: lhs) } } // MARK: - Initializers public extension String { /// SwifterSwift: Create a new string from a base64 string (if applicable). /// /// - Parameter base64: base64 string. public init?(base64: String) { guard let str = base64.base64Decoded else { return nil } self.init(str) } } // MARK: - NSAttributedString extensions public extension String { #if !os(tvOS) && !os(watchOS) /// SwifterSwift: Bold string. public var bold: NSAttributedString { #if os(macOS) return NSMutableAttributedString(string: self, attributes: [NSFontAttributeName: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize())]) #else return NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)]) #endif } #endif /// SwifterSwift: Underlined string public var underline: NSAttributedString { return NSAttributedString(string: self, attributes: [NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue]) } /// SwifterSwift: Strikethrough string. public var strikethrough: NSAttributedString { return NSAttributedString(string: self, attributes: [NSAttributedString.Key.strikethroughStyle: NSNumber(value: NSUnderlineStyle.single.rawValue as Int)]) } #if os(iOS) /// SwifterSwift: Italic string. public var italic: NSAttributedString { return NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.font: UIFont.italicSystemFont(ofSize: UIFont.systemFontSize)]) } #endif #if os(macOS) /// SwifterSwift: Add color to string. /// /// - Parameter color: text color. /// - Returns: a NSAttributedString versions of string colored with given color. public func colored(with color: NSColor) -> NSAttributedString { return NSMutableAttributedString(string: self, attributes: [NSForegroundColorAttributeName: color]) } #else /// SwifterSwift: Add color to string. /// /// - Parameter color: text color. /// - Returns: a NSAttributedString versions of string colored with given color. public func colored(with color: UIColor) -> NSAttributedString { return NSMutableAttributedString(string: self, attributes: [NSAttributedString.Key.foregroundColor: color]) } #endif } //MARK: - NSString extensions public extension String { /// SwifterSwift: NSString from a string. public var nsString: NSString { return NSString(string: self) } /// SwifterSwift: NSString lastPathComponent. public var lastPathComponent: String { return (self as NSString).lastPathComponent } /// SwifterSwift: NSString pathExtension. public var pathExtension: String { return (self as NSString).pathExtension } /// SwifterSwift: NSString deletingLastPathComponent. public var deletingLastPathComponent: String { return (self as NSString).deletingLastPathComponent } /// SwifterSwift: NSString deletingPathExtension. public var deletingPathExtension: String { return (self as NSString).deletingPathExtension } /// SwifterSwift: NSString pathComponents. public var pathComponents: [String] { return (self as NSString).pathComponents } /// SwifterSwift: NSString appendingPathComponent(str: String) /// /// - Parameter str: the path component to append to the receiver. /// - Returns: a new string made by appending aString to the receiver, preceded if necessary by a path separator. public func appendingPathComponent(_ str: String) -> String { return (self as NSString).appendingPathComponent(str) } /// SwifterSwift: NSString appendingPathExtension(str: String) /// /// - Parameter str: The extension to append to the receiver. /// - Returns: a new string made by appending to the receiver an extension separator followed by ext (if applicable). public func appendingPathExtension(_ str: String) -> String? { return (self as NSString).appendingPathExtension(str) } } extension String { /// EZSE: Checks if string is empty or consists only of whitespace and newline self public var isBlank: Bool { let trimmed = trimmingCharacters(in: .whitespacesAndNewlines) return trimmed.isEmpty } /// EZSE: split string using a spearator string, returns an array of string public func split(_ separator: String) -> [String] { return self.components(separatedBy: separator).filter { !$0.trimmed.isEmpty } } /// EZSE: split string with delimiters, returns an array of string public func split(_ separator: CharacterSet) -> [String] { return self.components(separatedBy: separator).filter { !$0.trimmed.isEmpty } } /// EZSE: Returns if String is a number public func isNumber() -> Bool { if let _ = NumberFormatter().number(from: self) { return true } return false } /// EZSE: Extracts URLS from String public var extractURLs: [URL] { var urls: [URL] = [] let detector: NSDataDetector? do { detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) } catch _ as NSError { detector = nil } let text = self if let detector = detector { detector.enumerateMatches(in: text, options: [], range: NSRange(location: 0, length: text.count), using: { (result: NSTextCheckingResult?, flags: NSRegularExpression.MatchingFlags, stop: UnsafeMutablePointer) -> Void in if let result = result, let url = result.url { urls.append(url) } }) } return urls } /// EZSE: Checking if String contains input with comparing options public func contains(_ find: String, compareOption: NSString.CompareOptions) -> Bool { return self.range(of: find, options: compareOption) != nil } #if os(iOS) /// EZSE: copy string to pasteboard public func addToPasteboard() { let pasteboard = UIPasteboard.general pasteboard.string = self } #endif /// EZSE: Checks if String contains Emoji public func includesEmoji() -> Bool { for i in 0...length { let c: unichar = (self as NSString).character(at: i) if (0xD800 <= c && c <= 0xDBFF) || (0xDC00 <= c && c <= 0xDFFF) { return true } } return false } } extension String { init(_ value: Float, precision: Int) { let nFormatter = NumberFormatter() nFormatter.numberStyle = .decimal nFormatter.maximumFractionDigits = precision self = nFormatter.string(from: NSNumber(value: value))! } init(_ value: Double, precision: Int) { let nFormatter = NumberFormatter() nFormatter.numberStyle = .decimal nFormatter.maximumFractionDigits = precision self = nFormatter.string(from: NSNumber(value: value))! } } /// EZSE: Pattern matching of strings via defined functions public func ~= (pattern: ((T) -> Bool), value: T) -> Bool { return pattern(value) } /// EZSE: Can be used in switch-case public func hasPrefix(_ prefix: String) -> (_ value: String) -> Bool { return { (value: String) -> Bool in value.hasPrefix(prefix) } } /// EZSE: Can be used in switch-case public func hasSuffix(_ suffix: String) -> (_ value: String) -> Bool { return { (value: String) -> Bool in value.hasSuffix(suffix) } } extension String { var numbers: String { return String(self.filter { "0"..."9" ~= $0 }) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSModel/README.md ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSStyleGuide/JSCommentStyleGudie.swift ================================================ // // JSCommentStyleGudie.swift // LoveYou // // Created by WengHengcong on 2016/10/20. // Copyright © 2016年 JungleSong. All rights reserved. // //以下是为了测试注释 //参考:http://nshipster.cn/swift-documentation/ import Foundation /// 🚲 一个两轮的,人力驱动的交通工具. class Bicycle { /** 车架样式. - Road: 用于街道或步道. - Touring: 用于长途. - Cruiser: 用于城镇周围的休闲之旅. - Hybrid: 用于通用运输. */ enum Style { case Road, Touring, Cruiser, Hybrid } /** 转换踏板功率为运动的机制。 - Fixed: 一个单一的,固定的齿轮。 - Freewheel: 一个可变速,脱开的齿轮。 */ enum Gearing { case Fixed case Freewheel(speeds: Int) } /** 用于转向的硬件。 - Riser: 一个休闲车把。 - Café: 一个正常车把。 - Drop: 一个经典车把. - Bullhorn: 一个超帅车把. */ enum Handlebar { case Riser, Café, Drop, Bullhorn } enum KJKJ { case ik } /// 自行车的风格 let style: Style /// 自行车的齿轮 let gearing: Gearing /// 自行车的车把 let handlebar: Handlebar /// 车架大小, 厘米为单位. let frameSize: Int /// 自行车行驶的旅程数 private(set) var numberOfTrips: Int /// 自行车总共行驶的距离,米为单位 private(set) var distanceTravelled: Double /** 使用提供的部件及规格初始化一个新自行车。 :param: style 自行车的风格 :param: gearing 自行车的齿轮 :param: handlebar 自行车的车把 :param: centimeters 自行车的车架大小,单位为厘米 :returns: 一个漂亮的,全新的,为你度身定做. */ init(style: Style, gearing: Gearing, handlebar: Handlebar, frameSize centimeters: Int) { self.style = style self.gearing = gearing self.handlebar = handlebar self.frameSize = centimeters self.numberOfTrips = 0 self.distanceTravelled = 0 } /** 把自行车骑出去遛一圈 :param: meters 行驶的距离,单位为米 */ func travel(distance meters: Double) { if meters > 0 { distanceTravelled += meters numberOfTrips+=1 } } } // MARK: Printable extension Bicycle { var description: String { var descriptors: [String] = [] switch self.style { case .Road: descriptors.append("A road bike for streets or trails") case .Touring: descriptors.append("A touring bike for long journeys") case .Cruiser: descriptors.append("A cruiser bike for casual trips around town") case .Hybrid: descriptors.append("A hybrid bike for general-purpose transportation") } switch self.gearing { case .Fixed: descriptors.append("with a single, fixed gear") case .Freewheel(let n): descriptors.append("with a \(n)-speed freewheel gear") } switch self.handlebar { case .Riser: descriptors.append("and casual, riser handlebars") case .Café: descriptors.append("and upright, café handlebars") case .Drop: descriptors.append("and classic, drop handlebars") case .Bullhorn: descriptors.append("and powerful bullhorn handlebars") } descriptors.append("on a \(frameSize)\" frame") // FIXME: // FIXME: 使用格式化的距离 descriptors.append("with a total of \(distanceTravelled) meters traveled over \(numberOfTrips) trips.") // TODO: // DEBUG: // TODO: 允许自行车被命名吗? return descriptors[0] } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSStyleGuide/README.md ================================================ # 参考 https://github.com/raywenderlich/swift-style-guide https://github.com/github/swift-style-guide # 命名 # 注释 ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/JSSearchBar.swift ================================================ // // JSSearchBar.swift // BeeFun // // Created by WengHengcong on 13/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class JSSearchBar: UISearchBar { /// 保留iOS 11 之前的风格 var keepBeforeStyle: Bool? { didSet { if keepBeforeStyle! { self.heightAnchor.constraint(equalToConstant: uiNavigationBarHeight).isActive = true contentInset = UIEdgeInsets(top: 3, left: 0, bottom: 3, right: -4) } else { self.heightAnchor.constraint(equalToConstant: 56).isActive = true contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) } } } var contentInset: UIEdgeInsets? { didSet { self.layoutSubviews() } } override func layoutSubviews() { super.layoutSubviews() // view是searchBar中的唯一的直接子控件 for view in self.subviews { // UISearchBarBackground与UISearchBarTextField是searchBar的简介子控件 for subview in view.subviews { // 找到UISearchBarTextField if subview.isKind(of: UITextField.classForCoder()) { if let textFieldContentInset = contentInset { // 若contentInset被赋值 // 根据contentInset改变UISearchBarTextField的布局 let x = subview.x + textFieldContentInset.left let y = subview.y + textFieldContentInset.top let w = subview.width - textFieldContentInset.left - textFieldContentInset.right let h = subview.height - textFieldContentInset.top - textFieldContentInset.bottom subview.frame = CGRect(x: x, y: y, width: w, height: h) } // else { // 若contentSet未被赋值 // // 设置UISearchBar中UISearchBarTextField的默认边距 // let top: CGFloat = (self.bounds.height - 28.0) / 2.0 // let bottom: CGFloat = top // let left: CGFloat = 8.0 // let right: CGFloat = left // contentInset = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right) // } } } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSBaseCell.swift ================================================ // // JSBaseCell.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// Cell底部线的类型 /// 参考Apple Settings app的值 /// - full: 线铺满整个屏幕 /// - label: 线对齐Label,默认距离左边距15 /// - image: 线对齐Image,默认距离左边距60 enum CellLineType { case label case image case full } class JSBaseCell: UITableViewCell, JSBaseCellProtocol { var model: JSCellModel? { didSet { fillData() } } var type: String { if let typeFormModel = model?.type { return typeFormModel } else { assertionFailure("Undefined type") return "" } } var id: String { if let identifier = model?.identifier { return identifier } else { return "" } } /** * 是否为完整的底部灰线 */ var bottomLineType: CellLineType = .label { didSet { let retinaPixelSize = 1.0 / (UIScreen.main.scale) let bottomY = self.height - retinaPixelSize let botView: UIView = UIView() botView.backgroundColor = UIColor.bfLineBackgroundColor self.addSubview(botView) switch bottomLineType { case .full: botView.frame = CGRect(x: 0, y: bottomY, w: ScreenSize.width, h: retinaPixelSize) case .label: botView.frame = CGRect(x: uiCellLabelLeftMargin, y: bottomY, w: ScreenSize.width-uiCellLabelLeftMargin, h: retinaPixelSize) case .image: botView.frame = CGRect(x: uiCellImageLeftMargin, y: bottomY, w: ScreenSize.width-uiCellImageLeftMargin, h: retinaPixelSize) } } } /** * 是否有顶部线条 */ var isFirst: Bool = false { didSet { let retinaPixelSize = 1.0 / (UIScreen.main.scale) if isFirst { let topView: UIView = UIView() topView.backgroundColor = UIColor.bfLineBackgroundColor self.addSubview(topView) topView.frame = CGRect(x: 0, y: 0, w: ScreenSize.width, h: retinaPixelSize) } } } /// 从View中获取Cell static func cellFromNibNamed(_ nibName: String) -> AnyObject { var nibContents: Array = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)! let xibBasedCell = nibContents[0] return xibBasedCell as AnyObject } /// 自定义界面 override func awakeFromNib() { super.awakeFromNib() customCellView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } /// 自定义界面代码 func customCellView() { } /// 刷新填充UI数据 func fillData() { } /// 设置Cell的头部和尾部的分割线 /// /// - Parameters: /// - current: 当前cell所在row /// - rowsOfSection: 当前cell所在section的row总行数 func bothEndsLine(_ current: Int, all rowsOfSection: Int) { isFirst = current==0 let oriBottomLineType = bottomLineType bottomLineType = (current == rowsOfSection-1 ? .full : oriBottomLineType) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellDefine.swift ================================================ // // JSCellDefine.swift // BeeFun // // Created by WengHengcong on 2017/5/5. // Copyright © 2017年 JungleSong. All rights reserved. // /// CellModel数据源可定制字段说明 /// /// - type: 必选字段:Cell类型 /// - id: 必选字段:key作为cell的标识,在同一个tableview中要保持唯一 /// - key: 可选字段:左边标题 /// - subkey: 可选字段:左边标题下部的标题 /// - value: 可选字段:右边详情描述 /// - icon: 可选字段:左边在标题前边的icon /// - ksize: 可选字段:key对应的KeyLabel的字体大小 /// - vsize: 可选字段:value对应的valueLabel的字体大小 /// - iconsize: 可选字段:icon大小,正方形 /// - seleted: 可选字段:右边是否选中 /// - disclosure: 可选字段:是否显示详情图标 /// - switched: 可选字段:switch开关 enum JSCellModelKey: String { case type case id case key /*** 适用JSLabelCell/JSSubLabelCell/JSImageCell/JSSelectedCell/JSSwitchCell类型 ***/ case subkey /*** 适用JSSubLabelCell ***/ case value /*** 适用JSLabelCell/JSSubLabelCell ***/ case icon /*** 适用JSImageCell ***/ case ksize /*** 适用JSLabelCell/JSSubLabelCell/JSImageCell/JSSelectedCell/JSSwitchCell类型 ***/ case vsize /*** 适用JSLabelCell/JSSubLabelCell/JSImageCell/JSSelectedCell/JSSwitchCell类型 ***/ case iconsize /*** 适用JSImageCell ***/ case seleted /*** 适用JSSelectedCell ***/ case disclosure /*** 适用JSImageCell/JSLabelCell/JSSubLabelCell ***/ case switched /*** 适用JSSwitchCell ***/ } /// Cell类型 /// /// - label: Cell中只有Label /// - image: Cell中左边含有Icon /// - selected: Cell中右边含有选中按钮 /// - switched: Cell中含有UISwitch控件 enum JSCellType: String { case label case image case selected case switched case edit } let jsCellDefaultSize: CGFloat = 17.0 let jsCellIconSize: CGFloat = 25.0 /******************************** CellModel中字段 ********************************/ /// - type: 必选字段:Cell类型 let JSCellModelKeyType = "type" /// - id: 必选字段:key作为cell的标识,在同一个tableview中要保持唯一 let JSCellModelKeyId = "id" /// - key: 可选字段:左边标题 let JSCellModelKeyKey = "key" /// - subkey: 可选字段:左边标题下部的标题 let JSCellModelKeySubKey = "subkey" /// - value: 可选字段:右边详情描述 let JSCellModelKeyValue = "value" /// - icon: 可选字段:左边在标题前边的icon let JSCellModelKeyIcon = "icon" /// - ksize: 可选字段:key对应的KeyLabel的字体大小 let JSCellModelKeyKSize = "ksize" /// - vsize: 可选字段:value对应的valueLabel的字体大小 let JSCellModelKeyVSize = "vsize" /// - iconsize: 可选字段:icon大小,正方形 let JSCellModelKeyIconSize = "iconsize" /// - seleted: 可选字段:右边是否选中 let JSCellModelKeySeleted = "seleted" /// - disclosure: 可选字段:是否显示详情图标 let JSCellModelKeyDisclosure = "disclosure" /// - switched: 可选字段:switch开关 let JSCellModelKeySwitched = "switched" /******************************** CellModel的类型 ********************************/ /// - label: Cell中只有Label let JSCellModelTypeLabel = "label" /// - image: Cell中左边含有Icon let JSCellModelTypeImage = "image" /// - selected: Cell中右边含有选中按钮 let JSCellModelTypeSeleted = "selected" /// - switched: Cell中含有UISwitch控件 let JSCellModelTypeSwitched = "switched" /// - edit: Cell中含有UITextField控件 let JSCellModelTypeEdit = "edit" /******************************** CellModel 动作 ********************************/ typealias CellDidSelectHandler = ((_ tableView: UITableView, _ indexPath: IndexPath, _ model: JSCellModel) -> Void)? typealias SwitchValueChangeHandler = ((_ switcher: UISwitch, _ on: Bool, _ model: JSCellModel) -> Void)? ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellFactory.swift ================================================ // // JSCellFactory.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSCellFactory: NSObject { /// cell 类型与类的字典 static var cellMap: [String:String]? /// 注册类 class func registerCellInfo() { registCell("label", cellClass: "JSLabelCell") registCell("sublabel", cellClass: "JSSubLabelCell") registCell("image", cellClass: "JSImageCell") registCell("selected", cellClass: "JSSelectedCell") registCell("switched", cellClass: "JSSwitchCell") registCell("edit", cellClass: "JSEditCell") } /// 注册对应类与类型 class func registCell(_ type: String?, cellClass: String?) { assert(type != nil, "type is nil") assert(cellClass != nil, "identifier is nil") if cellMap == nil { cellMap = [type!: cellClass!] } else { cellMap![type!] = cellClass! } } /// 返回对应type的Cell Class class func cell(type: String) -> AnyObject? { if cellMap == nil { return UITableViewCell() } if let cellClassName = cellMap![type] { var cellClass = JSBaseCell.cellFromNibNamed(cellClassName) switch cellClassName { case "JSLabelCell": cellClass = JSLabelCell.cellFromNibNamed(cellClassName) case "JSImageCell": cellClass = JSImageCell.cellFromNibNamed(cellClassName) case "JSSelectedCell": cellClass = JSSelectedCell.cellFromNibNamed(cellClassName) case "JSSwitchCell": cellClass = JSSwitchCell.cellFromNibNamed(cellClassName) case "JSEditCell": cellClass = JSEditCell.cellFromNib(name: cellClassName) default: break } return cellClass } else { assertionFailure("Cell key has not register") } return UITableViewCell() } /// 返回对应type的Cell Class String class func cellClass(type: String) -> String { if cellMap == nil { return "" } if let cellClassName = cellMap![type] { return cellClassName } else { assertionFailure("Cell key has not register") } return "" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellModel+Init.swift ================================================ // // JSCellModel+Init.swift // BeeFun // // Created by WengHengcong on 25/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit extension JSCellModel { // MARK: - 初始化 convenience init(_ keyvalues: [String : Any]) { self.init() setValuesForKeys(keyvalues) } /// Label Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - discosure: 是否显示详情图标 convenience init(type: String, id: String, key: String?, value: String?, discosure: Bool?) { self.init(type: type, id: id, key: key, value: value, discosure: false, keySize: jsCellDefaultSize, valueSize: jsCellDefaultSize) } /// Label Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - discosure: 是否显示详情图标 /// - keySize: key对应字体大小 /// - valueSize: valud对应字体大小 convenience init(type: String, id: String, key: String?, value: String?, discosure: Bool?, keySize: CGFloat?, valueSize: CGFloat?) { self.init() self.type = type self.identifier = id self.key = key self.value = value if let dis = discosure { self.discosure = dis } if let ksize = keySize { self.keySize = ksize } if let vsize = valueSize { self.valueSize = vsize } } /// Image Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - icon: 图片名 /// - discosure: 是否显示详情图标 convenience init(type: String, id: String, key: String?, value: String?, icon: String?, discosure: Bool?) { self.init(type: type, id: id, key: key, value: value, icon: icon, discosure: discosure, keySize: jsCellDefaultSize, valueSize: jsCellDefaultSize) } /// Image Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - discosure: 是否显示详情图标 /// - keySize: key对应字体大小 /// - valueSize: valud对应字体大小 convenience init(type: String, id: String, key: String?, value: String?, icon: String?, discosure: Bool?, keySize: CGFloat?, valueSize: CGFloat?) { self.init() self.type = type self.identifier = id self.key = key self.value = value self.icon = icon if let dis = discosure { self.discosure = dis } if let ksize = keySize { self.keySize = ksize } if let vsize = valueSize { self.valueSize = vsize } } /// Edit Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - placeholder: 占位符 convenience init(type: String, id: String, key: String?, value: String?, placeholder: String?) { self.init(type: type, id: id, key: key, value: value, placeholder: placeholder, keySize: jsCellDefaultSize, valueSize: jsCellDefaultSize) } /// Edit Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - value: 右边详情描述 /// - placeholder: 占位符 /// - keySize: key对应字体大小 /// - valueSize: valud对应字体大小 convenience init(type: String, id: String, key: String?, value: String?, placeholder: String?, keySize: CGFloat?, valueSize: CGFloat?) { self.init() self.type = type self.identifier = id self.key = key self.value = value self.placeholder = placeholder if let ksize = keySize { self.keySize = ksize } if let vsize = valueSize { self.valueSize = vsize } } /// Switched Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - switched: 开关值 convenience init(type: String, id: String, key: String?, switched: Bool?) { self.init(type: type, id: id, key: key, switched: switched, keySize: jsCellDefaultSize) } /// Switched Cell Model 初始化 /// /// - Parameters: /// - type: Cell类型 /// - id: key作为cell的标识 /// - key: 左边标题 /// - switched: 开关值 /// - keySize: key对应字体大小 convenience init(type: String, id: String, key: String?, switched: Bool?, keySize: CGFloat?) { self.init() self.type = type self.identifier = id self.key = key if let swi = switched { self.switched = swi } else { self.switched = false } if let ksize = keySize { self.keySize = ksize } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellModel.swift ================================================ // // JSCellModel.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSCellModel: NSObject { /************************** 数据源字段(Plist) ***********************/ // MARK: - 必选字段 /// Cell类型 var type: String? /// key作为cell的标识 var identifier: String? // MARK: - 可选字段 /*** 适用JSLabelCell/JSSubLabelCell/JSImageCell/JSSelectedCell/JSSwitchCell/JSEditCell类型 ***/ /// 左边标题 var key: String? /*** 适用JSSubLabelCell ***/ /// 左边标题下部的标题 var subkey: String? /*** 适用JSLabelCell/JSSubLabelCell/JSEditCell ***/ /// 右边详情描述 var value: String? /*** 适用JSImageCell ***/ /// 左边在标题前边的icon var icon: String? /// icon大小,正方形 var iconSize: CGFloat = jsCellIconSize /*** 适用JSSelectedCell ***/ /// 右边是否选中 var selected: Bool = false /*** 适用JSImageCell/JSLabelCell/JSSubLabelCell ***/ /// 是否显示详情图标 var discosure: Bool = false /*** 适用JSSwitchCell ***/ /// switch开关 var switched: Bool = false /*** 适用JSEditCell ***/ var placeholder: String? /// key对应的KeyLabel的字体大小 var keySize: CGFloat = jsCellDefaultSize /// value对应的valueLabel的字体大小 var valueSize: CGFloat = jsCellDefaultSize /************************** setter字段 ***********************/ /// 左边标题,attributetext,只能通过setter方法设置,不能从plist等数据源获取该部分 var attributeKey: NSAttributedString? /// 右边详情描述,attributetext可用,只能通过setter方法设置,不能从plist等数据源获取该部分 var attributeValue: NSAttributedString? /// cellModel didSelect closure var didSelectClosure: CellDidSelectHandler = nil /// cellModel didSelect closure var switchValueChangeClosure: SwitchValueChangeHandler = nil override init() { super.init() } // MARK: - 解析 /// 从数据源解析数据方法 override func setValue(_ value: Any?, forUndefinedKey key: String) { return } /// 从plist或者网络获取到的值,设置到model override func setValuesForKeys(_ keyedValues: [String : Any]) { let cellType = keyedValues[JSCellModelKeyType] as? String assert(cellType != nil, "cell type undefined") identifier = keyedValues[JSCellModelKeyId] as? String type = cellType //if attributeKey not nil,ignore key key = keyedValues[JSCellModelKeyKey] as? String subkey = keyedValues[JSCellModelKeySubKey] as? String value = keyedValues[JSCellModelKeyValue] as? String icon = keyedValues[JSCellModelKeyIcon] as? String if let keysize = keyedValues[JSCellModelKeyKSize] as? CGFloat { keySize = keysize } if let valuesize = keyedValues[JSCellModelKeyVSize] as? CGFloat { valueSize = valuesize } if let iconsize = keyedValues[JSCellModelKeyIconSize] as? CGFloat { iconSize = iconsize } if let seled = keyedValues[JSCellModelKeySeleted] { if seled is String { selected = (seled as! String).bool! } else if seled is Bool { selected = seled as! Bool } else { assertionFailure("cell model selected datatype is incorrect") selected = false } } if let dised = keyedValues[JSCellModelKeyDisclosure] { if dised is String { discosure = (dised as! String).bool! } else if dised is Bool { discosure = dised as! Bool } else { assertionFailure("cell model discosure datatype is incorrect") discosure = false } } if let swed = keyedValues[JSCellModelKeySeleted] { if swed is String { switched = (swed as! String).bool! } else if swed is Bool { switched = swed as! Bool } else { assertionFailure("cell model switched datatype is incorrect") switched = false } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellModelFactory.swift ================================================ // // JSCellModelFactory.swift // BeeFun // // Created by WengHengcong on 25/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// Model工厂 class JSCellModelFactory { // MARK: - Label static func labelInit(type: String, id: String, key: String?, value: String?, discosure: Bool?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, discosure: false) return cellM } static func labelInit(type: String, id: String, key: String?, value: String?, discosure: Bool?, keySize: CGFloat?, valueSize: CGFloat?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, discosure: discosure, keySize: keySize, valueSize: valueSize) return cellM } // MARK: - Image static func imageInit(type: String, id: String, key: String?, value: String?, icon: String?, discosure: Bool?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, icon: icon, discosure: discosure) return cellM } static func imageInit(type: String, id: String, key: String?, value: String?, icon: String?, discosure: Bool?, keySize: CGFloat?, valueSize: CGFloat?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, icon: icon, discosure: discosure, keySize: keySize, valueSize: valueSize) return cellM } // MARK: - Edit static func eidtInit(type: String, id: String, key: String?, value: String?, placeholder: String?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, placeholder: placeholder) return cellM } static func eidtInit(type: String, id: String, key: String?, value: String?, placeholder: String?, keySize: CGFloat?, valueSize: CGFloat?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, value: value, placeholder: placeholder, keySize: keySize, valueSize: valueSize) return cellM } // MARK: - Switch static func switchInit(type: String, id: String, key: String?, switched: Bool?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, switched: switched) return cellM } static func switchInit(type: String, id: String, key: String?, switched: Bool?, keySize: CGFloat?) -> JSCellModel { let cellM = JSCellModel.init(type: type, id: id, key: key, switched: switched, keySize: keySize) return cellM } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellProtocol.swift ================================================ // // JSCellProtocol.swift // BeeFun // // Created by WengHengcong on 2017/5/6. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// Cell的共有属性 public protocol JSBaseCellProtocol: class { /// Cell Type:Image/Label.... var type: String { get } /// Cell Identifier:主要用于didSelected var id: String { get } /// 自定义Cell的视图 func customCellView() /// 填充数据 func fillData() } /// Label Cell的独有属性 protocol JSLabelCellCustomProtocol: class { /// key label字体大小,默认17.0 var keyFontSize: CGFloat { get set } /// value label字体大小,默认17.0 var valueFontSize: CGFloat { get set } } /// Image Cell的独有属性 protocol JSImageCellCustomProtocol: class { /// key label字体大小,默认17.0 var keyFontSize: CGFloat { get set } /// value label字体大小,默认17.0 var valueFontSize: CGFloat { get set } /// Icon的圆角类型,默认没有圆角:.none var cellCornerType: IconCornerType { get set } /// Icon的大小:默认25*25 var iconSize: CGFloat { get set } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSCellUtils.swift ================================================ // // JSCellUtils.swift // BeeFun // // Created by WengHengcong on 06/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class JSCellUtils: NSObject { class func bfSystemFont(ofSize: CGFloat) -> UIFont { if iOSVersion.iOS9Later { return UIFont(name: "PingFang-SC-Regular", size: ofSize)! } return UIFont.systemFont(ofSize: ofSize) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSEditCell.swift ================================================ // // JSEditCell.swift // BeeFun // // Created by WengHengcong on 25/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class JSEditCell: JSBaseCell { @IBOutlet weak var keyLabel: UILabel! @IBOutlet weak var valueText: UITextField! var value: String? { set { self.value = newValue valueText.text = value } get { return valueText.text } } var keyFontSize: CGFloat = 17.0 { didSet { keyLabel.font = JSCellUtils.bfSystemFont(ofSize: keyFontSize) } } var valueFontSize: CGFloat = 17.0 { didSet { valueText.font = JSCellUtils.bfSystemFont(ofSize: valueFontSize) } } override func customCellView() { super.customCellView() bottomLineType = .label isFirst = false keyLabel.textAlignment = .left keyFontSize = 17.0 valueText.textAlignment = .right valueFontSize = 15.0 } override func fillData() { super.fillData() //TEST: // keyLabel.backgroundColor = UIColor.red // valueText.backgroundColor = UIColor.green keyLabel.adjustFontSizeToFitWidth(minScale: 0.5) valueText.adjustFontSizeToFitWidth(minFont: valueFontSize/2.0) if let attributeKey = model?.attributeKey { keyLabel.attributedText = attributeKey } else { keyLabel.text = model?.key?.localized } if let attributeValue = model?.attributeValue { valueText.attributedText = attributeValue } else { valueText.text = model?.value?.localized } /// 配置的数据源高于设置 if let keySize = model?.keySize { keyFontSize = keySize } if let valueSize = model?.valueSize { valueFontSize = valueSize } setNeedsLayout() } override func layoutSubviews() { super.layoutSubviews() let hasModel = (model != nil) ? true : false keyLabel.isHidden = !hasModel if hasModel { let cellWidth = ScreenSize.width let keyW: CGFloat = 70 let valueW = cellWidth-keyW-10-uiCellLabelLeftMargin keyLabel.frame = CGRect(x: uiCellLabelLeftMargin, y: 0, w: keyW, h: self.height) valueText.frame = CGRect(x: keyLabel.right, y: 0, w: valueW, h: self.height) } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSEditCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSImageCell.swift ================================================ // // JSImageCell.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// Icon 圆角类型 /// /// - none: 没有圆角,Icon原来是什么,就是什么 /// - oval: 椭圆形圆角, /// - round: 圆形圆角 enum IconCornerType { case none case oval case round } /// 含Icon的Cell /// | | /// |icon key value| /// | | class JSImageCell: JSBaseCell, JSImageCellCustomProtocol { /// ICON大小为25*25 @IBOutlet weak var iconImageV: UIImageView! @IBOutlet weak var keyLabel: UILabel! @IBOutlet weak var valueLabel: UILabel! @IBOutlet weak var disclosureImgV: UIImageView! var keyFontSize: CGFloat = 17.0 { didSet { keyLabel.font = JSCellUtils.bfSystemFont(ofSize: keyFontSize) } } var valueFontSize: CGFloat = 17.0 { didSet { valueLabel.font = JSCellUtils.bfSystemFont(ofSize: valueFontSize) } } var cellCornerType: IconCornerType = .none { didSet { switch cellCornerType { case .none: break case .oval: iconImageV.radius = 3.5 case .round: iconImageV.radius = 15 } } } var iconSize: CGFloat = 25.0 { didSet { iconImageV.frame = CGRect(x: iconImageV.x, y: iconImageV.y, w: iconSize, h: iconSize) } } override func customCellView() { super.customCellView() bottomLineType = .label cellCornerType = .none isFirst = false keyFontSize = 17.0 valueFontSize = 15.0 disclosureImgV.image = UIImage(named: "arrow_set_right") keyLabel.textAlignment = .left valueLabel.textAlignment = .right } override func fillData() { super.fillData() keyLabel.adjustFontSizeToFitWidth(minScale: 0.5) valueLabel.adjustFontSizeToFitWidth(minScale: 0.5) if let attributeKey = model?.attributeKey { keyLabel.attributedText = attributeKey } else { keyLabel.text = model?.key?.localized } if let attributeValue = model?.attributeValue { valueLabel.attributedText = attributeValue } else { valueLabel.text = model?.value?.localized } /// 配置的数据源高于设置 if let keySize = model?.keySize { keyFontSize = keySize } if let valueSize = model?.valueSize { valueFontSize = valueSize } if let hasDis = model?.discosure { disclosureImgV.isHidden = !hasDis } assert(model?.icon != nil, "Image Cell icon is nil") if let iconName = model?.icon { iconImageV.image = UIImage(named: iconName) } setNeedsLayout() } override func layoutSubviews() { super.layoutSubviews() let hasModel = (model != nil) ? true : false keyLabel.isHidden = !hasModel valueLabel.isHidden = !hasModel if hasModel { var cellWidth = ScreenSize.width switch bottomLineType { case .label: cellWidth -= uiCellLabelLeftMargin case .image: cellWidth -= uiCellImageLeftMargin case .full: break } let iconX = uiCellLabelLeftMargin let iconY: CGFloat = (self.height-iconSize)/2 iconImageV.frame = CGRect(x: iconX, y: iconY, w: iconSize, h: iconSize) /// txtWidth 指的是文字长短 let txtWidth = ScreenSize.width-uiCellImageLeftMargin var titW = txtWidth/2.0 - 20 var detailW = txtWidth/2.0 + 20 let disRightMargin: CGFloat = 15 let disW: CGFloat = 8 let disH: CGFloat = 14 let disY: CGFloat = (self.height-disH)/2 let disX: CGFloat = ScreenSize.width-disW-disRightMargin /// discolsure iamge整个大小 let disAllWidth = disW+disRightMargin+13 if model?.discosure == true { disclosureImgV.frame = CGRect(x: disX, y: disY, w: disW, h: disH) if model!.value != nil { detailW -= disAllWidth } else { titW = txtWidth - disAllWidth } } else { if model!.value != nil { ///无详情箭头,也需要在对齐右边距时,有间隔 detailW -= uiCellLabelRightMargin } else { titW = txtWidth - uiCellLabelRightMargin } } keyLabel.frame = CGRect(x: uiCellImageLeftMargin, y: 0, w: titW, h: self.height) valueLabel.frame = CGRect(x: keyLabel.right, y: 0, w: detailW, h: self.height) } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSImageCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSLabelCell.swift ================================================ // // JSLabelCell.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// 只包含文字的Cell /// | | /// |key value >| /// | | class JSLabelCell: JSBaseCell, JSLabelCellCustomProtocol { @IBOutlet weak var keyLabel: UILabel! @IBOutlet weak var valueLabel: UILabel! @IBOutlet weak var disclosureImgV: UIImageView! var keyFontSize: CGFloat = 17.0 { didSet { keyLabel.font = JSCellUtils.bfSystemFont(ofSize: keyFontSize) } } var valueFontSize: CGFloat = 17.0 { didSet { valueLabel.font = JSCellUtils.bfSystemFont(ofSize: valueFontSize) } } override func customCellView() { super.customCellView() bottomLineType = .label isFirst = false disclosureImgV.image = UIImage(named: "arrow_set_right") keyLabel.textAlignment = .left keyFontSize = 17.0 valueLabel.textAlignment = .right valueFontSize = 15.0 } override func fillData() { super.fillData() keyLabel.adjustFontSizeToFitWidth(minScale: 0.5) valueLabel.adjustFontSizeToFitWidth(minScale: 0.5) if let attributeKey = model?.attributeKey { keyLabel.attributedText = attributeKey } else { keyLabel.text = model?.key?.localized } if let attributeValue = model?.attributeValue { valueLabel.attributedText = attributeValue } else { valueLabel.text = model?.value?.localized } /// 配置的数据源高于设置 if let keySize = model?.keySize { keyFontSize = keySize } if let valueSize = model?.valueSize { valueFontSize = valueSize } if let hasDis = model?.discosure { disclosureImgV.isHidden = !hasDis } setNeedsLayout() } override func layoutSubviews() { super.layoutSubviews() //TEST: // keyLabel.backgroundColor = UIColor.red // valueLabel.backgroundColor = UIColor.green // disclosureImgV.backgroundColor = UIColor.blue let hasModel = (model != nil) ? true : false keyLabel.isHidden = !hasModel valueLabel.isHidden = !hasModel if hasModel { var cellWidth = ScreenSize.width switch bottomLineType { case .label: cellWidth -= uiCellLabelLeftMargin case .image: cellWidth -= uiCellImageLeftMargin case .full: break } var titW: CGFloat = 0 var valueW: CGFloat = 0 var valueX: CGFloat = 0 let disRightMargin: CGFloat = 15 let disW: CGFloat = 8 let disH: CGFloat = 14 let disY: CGFloat = (self.height-disH)/2 let disX: CGFloat = ScreenSize.width-disW-disRightMargin /// discolsure iamge整个大小 let disAllWidth = disW+disRightMargin+10 valueLabel.isHidden = (model!.value == nil) if model?.discosure == true { disclosureImgV.frame = CGRect(x: disX, y: disY, w: disW, h: disH) if model!.value != nil { valueW = model!.value!.width(with: self.height, font: valueLabel.font) valueX = ScreenSize.width-disAllWidth-valueW titW = valueX-uiCellLabelLeftMargin } else { titW = ScreenSize.width - disAllWidth - uiCellLabelLeftMargin } } else { if model!.value != nil { valueW = model!.value!.width(with: self.height, font: valueLabel.font) valueX = ScreenSize.width-valueW-10-6 titW = valueX-uiCellLabelLeftMargin } else { titW = ScreenSize.width - uiCellLabelRightMargin } } valueLabel.frame = CGRect(x: valueX, y: 0, w: valueW, h: self.height) keyLabel.frame = CGRect(x: uiCellLabelLeftMargin, y: 0, w: titW, h: self.height) } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSLabelCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSelectedCell.swift ================================================ // // JSSelectedCell.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// 右边是选择控件,单选或者多选 /// | | /// |key ✅| /// | | class JSSelectedCell: JSBaseCell { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSelectedCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSubLabelCell.swift ================================================ // // JSSubLabelCell.swift // BeeFun // // Created by WengHengcong on 2017/5/6. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// 包含文字,但包含子标题,并且与主标题上下对齐 /// | | /// |key value >| /// |subkey | /// | | class JSSubLabelCell: NSObject { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSubLabelCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSwitchCell.swift ================================================ // // JSSwitchCell.swift // BeeFun // // Created by WengHengcong on 2017/5/4. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit /// 右边是UISWitch控件 /// | | /// |key ⊂∤⊃| /// | | class JSSwitchCell: JSBaseCell { @IBOutlet weak var keyLabel: UILabel! @IBOutlet weak var valueSwitch: UISwitch! var value:Bool { set { self.value = newValue valueSwitch.isOn = newValue } get { return valueSwitch.isOn } } var keyFontSize: CGFloat = 17.0 { didSet { keyLabel.font = JSCellUtils.bfSystemFont(ofSize: keyFontSize) } } override func customCellView() { super.customCellView() bottomLineType = .full keyFontSize = 17.0 keyLabel.textAlignment = .left } override func fillData() { super.fillData() keyLabel.adjustFontSizeToFitWidth(minScale: 0.5) if let m = model { keyLabel.text = m.key valueSwitch.isOn = m.switched /// 配置的数据源高于设置 if let keySize = model?.keySize { keyFontSize = keySize } valueSwitch.addTarget(self, action: #selector(switchValueChange), for: .valueChanged) } setNeedsLayout() } override func layoutSubviews() { super.layoutSubviews() var cellWidth = ScreenSize.width switch bottomLineType { case .label: cellWidth -= uiCellLabelLeftMargin case .image: cellWidth -= uiCellImageLeftMargin case .full: break } let hasModel = (model != nil) ? true : false keyLabel.isHidden = !hasModel if hasModel { let swiRightMargin: CGFloat = 15 let swiW: CGFloat = 51 let swiX: CGFloat = ScreenSize.width - swiW - swiRightMargin let swiH: CGFloat = 31 let swiY: CGFloat = (self.height-swiH)/2.0 valueSwitch.frame = CGRect(x: swiX, y: swiY, w: swiW, h: swiH) let keyW = cellWidth-(ScreenSize.width-valueSwitch.left)-10 keyLabel.frame = CGRect(x: uiCellLabelLeftMargin, y: 0, w: keyW, h: self.height) } } @objc func switchValueChange() { if let closure = model?.switchValueChangeClosure { closure(valueSwitch, valueSwitch.isOn , model!) } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/JSSwitchCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/README.md ================================================ # 配置数据源 Plist/JSON Plist针对TableView的结构仅支持,如下: ------------------Section 1 ------------Section 1 Row 1 [type:label] [key:Language] [value:En] ------------Section 1 Row 2 [type:label] [key:Language] [value:En] ------------------Section 2 ------------Section 2 Row 1 [type:iamge] [key:About] [icon:logo.png] # 键值对含义 | Key | Describe | | | ---- | -------- | ---- | | | | | | | | | | | | | ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/TableViewCell.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUI/TableViewCell/TableViewCell.xcassets/arrow_set_right.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "Chevron.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Chevron@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "Chevron@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/CGRect+Extension.swift ================================================ // // CGRect+Extension.swift // BeeFun // // Created by WengHengcong on 2017/3/29. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension CGRect { /// CGRect init /// /// - Parameters: /// - x: x /// - y: y /// - w: w /// - h: h public init(x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat) { self.init(x: x, y: y, width: w, height: h) } /// rect.x public var x: CGFloat { get { return self.origin.x } set(value) { self.origin.x = value } } /// rect.y public var y: CGFloat { get { return self.origin.y } set(value) { self.origin.y = value } } /// rect.width public var w: CGFloat { get { return self.size.width } set(value) { self.size.width = value } } /// rect.height public var h: CGFloat { get { return self.size.height } set(value) { self.size.height = value } } /// rect.area public var area: CGFloat { return self.h * self.w } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSApperence.swift ================================================ // // JSApperenceExtension.swift // LoveYou // // Created by WengHengcong on 2016/10/26. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSApperence: NSObject { public class func setTabbarTextColor(_ color: UIColor, for state: UIControl.State) { UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: color], for: state) } public class func setTabbarTextAttributes(_ attributes: [NSAttributedString.Key : Any]?, for state: UIControl.State) { UITabBarItem.appearance().setTitleTextAttributes(attributes, for: state) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSApplication.swift ================================================ // // JSApplication.swift // LoveYou // // Created by WengHengcong on 2017/2/27. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSApplication { public class func appDelegate() -> AppDelegate { let appDelegate = UIApplication.shared.delegate as! AppDelegate return appDelegate } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSCollectionViewCell.swift ================================================ // // JSCollectionViewCell.swift // LoveYou // // Created by WengHengcong on 2016/11/14. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSCollectionViewCell: UICollectionViewCell { override func awakeFromNib() { super.awakeFromNib() customCellView() } func customCellView() { } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSDevice.swift ================================================ // // JSDevice.swift // LoveYou // // Created by WengHengcong on 2016/11/10. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit // MARK: - screen info struct ScreenSize { static let bounds = UIScreen.bound static let width = UIScreen.width static let height = UIScreen.height static let scale = UIScreen.scale() static let maxLength = max(ScreenSize.width, ScreenSize.height) static let minLength = min(ScreenSize.width, ScreenSize.height) static let screen1_32Inch = UIScreen.isEqual(UIScreen.Size.screen1_32Inch) static let screen1_5Inch = UIScreen.isEqual(UIScreen.Size.screen1_5Inch) static let screen3_5Inch = UIScreen.isEqual(UIScreen.Size.screen3_5Inch) static let screen4_0Inch = UIScreen.isEqual(UIScreen.Size.screen4_0Inch) static let screen4_7Inch = UIScreen.isEqual(UIScreen.Size.screen4_7Inch) static let screen5_5Inch = UIScreen.isEqual(UIScreen.Size.screen5_5Inch) static let screen5_8Inch = UIScreen.isEqual(UIScreen.Size.screen5_8Inch) static let screen7_9Inch = UIScreen.isEqual(UIScreen.Size.screen7_9Inch) static let screen10_5Incn = UIScreen.isEqual(UIScreen.Size.screen10_5Incn) static let screen9_7Inch = UIScreen.isEqual(UIScreen.Size.screen9_7Inch) static let screen12_9Inch = UIScreen.isEqual(UIScreen.Size.screen12_9Inch) } // MARK: - device type struct DeviceType { static let isPad = UIDevice.isPad() static let isIPhone4 = UIDevice.iPhone4Series.contains(UIDevice.modelReadable()) static let isIPhone5 = UIDevice.iPhone5Series.contains(UIDevice.modelReadable()) static let isIPhone6 = UIDevice.iPhone6Series.contains(UIDevice.modelReadable()) static let isIPhone6Plus = UIDevice.iPhone6PlusSeries.contains(UIDevice.modelReadable()) static let isIPhone7 = UIDevice.iPhone7Series.contains(UIDevice.modelReadable()) static let isIPhone7Plus = UIDevice.iPhone7PlusSeries.contains(UIDevice.modelReadable()) static let isIPhone8 = UIDevice.iPhone8Series.contains(UIDevice.modelReadable()) static let isIPhone8Plus = UIDevice.iPhone8PlusSeries.contains(UIDevice.modelReadable()) static let isIPhoneX = UIDevice.iPhoneXSeries.contains(UIDevice.modelReadable()) static let isPortrait = UIDevice.isPortrait() static let isLandscape = UIDevice.isLandscape() } // MARK: - sysetem version struct iOSVersion { static let iOS7Earlier = UIDevice.iOS.equalOrEarlier(UIDevice.iOS.Version.seven) static let iOS7 = UIDevice.iOS.equal(UIDevice.iOS.Version.seven) static let iOS7Later = UIDevice.iOS.equalOrLater(UIDevice.iOS.Version.seven) static let iOS8Earlier = UIDevice.iOS.equalOrEarlier(UIDevice.iOS.Version.eight) static let iOS8 = UIDevice.iOS.equal(UIDevice.iOS.Version.eight) static let iOS8Later = UIDevice.iOS.equalOrLater(UIDevice.iOS.Version.eight) static let iOS9Earlier = UIDevice.iOS.equalOrEarlier(UIDevice.iOS.Version.nine) static let iOS9 = UIDevice.iOS.equal(UIDevice.iOS.Version.nine) static let iOS9Later = UIDevice.iOS.equalOrLater(UIDevice.iOS.Version.nine) static let iOS10Earlier = UIDevice.iOS.equalOrEarlier(UIDevice.iOS.Version.ten) static let iOS10 = UIDevice.iOS.equal(UIDevice.iOS.Version.ten) static let iOS10Later = UIDevice.iOS.equalOrLater(UIDevice.iOS.Version.ten) static let iOS11Earlier = UIDevice.iOS.equalOrEarlier(UIDevice.iOS.Version.eleven) static let iOS11 = UIDevice.iOS.equal(UIDevice.iOS.Version.eleven) static let iOS11Later = UIDevice.iOS.equalOrLater(UIDevice.iOS.Version.eleven) } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSFileManager.swift ================================================ // // JSFile.swift // LoveYou // // Created by WengHengcong on 2017/2/20. // Copyright © 2017年 JungleSong. All rights reserved. // import Foundation import SwiftyJSON import ObjectMapper class JSFileManager: NSObject { static let shared = JSFileManager() // MARK: - Directory class var homeDirectory: String { return NSHomeDirectory() } class var libraryDirectory: String { let documentsPath = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first! return documentsPath } class var tmpDirectory: String { return NSTemporaryDirectory() } class var documentDirectory: String { return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! } class var preferenceDirectory: String { return NSSearchPathForDirectoriesInDomains(.preferencePanesDirectory, .userDomainMask, true).first! } class var cachestDirectory: String { return NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] } // MARK: - Directory URL class var documentsUrl: URL { let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! return documentsUrl } class var cachestUrl: URL { let cachesUrl = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first! return cachesUrl } // MARK: - JSON public class func readJsonBySwiftyJSON(_ path: String) -> JSON { let path = Bundle.appBundle.path(forResource: path, ofType: "json") var result: JSON if path != nil { if let dataFromList = NSData(contentsOfFile: path!) { result = JSON(dataFromList) return result } else { return JSON.null } } else { return JSON.null } } public class func readJsonByMapper(_ path: String, object: T) -> T { let path = Bundle.appBundle.path(forResource: path, ofType: "json") if path != nil { if let dataFromList = NSData(contentsOfFile: path!) { let jsonStr: String = (NSString(data: dataFromList as Data, encoding: String.Encoding.utf8.rawValue))! as String // UTF8转String if let paraseObj = Mapper().map(JSONString:jsonStr) { return paraseObj } else { return JSObject() as! T } } else { return JSObject() as! T } } else { return JSObject() as! T } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSNavigationController.swift ================================================ // // JSNavigationController.swift // LoveYou // // Created by WengHengcong on 2016/10/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSNavigationController: UINavigationController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSTabBarController.swift ================================================ // // JSTabBarController.swift // LoveYou // // Created by WengHengcong on 2016/10/30. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSTabBarController: UITabBarController { var titles: [String]? var images: [String]? var selectedImages: [String]? var controllers: [String]? // MARK: 初始化方法 init() { super.init(nibName: nil, bundle: nil) } convenience init?(viewControllers controllers: [String], titles: [String], images: [String], selectedImages: [String]) { self.init() self.controllers = controllers self.titles = titles self.images = images self.selectedImages = selectedImages } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override open func viewDidLoad() { super.viewDidLoad() } /// 加载所有的控制器 open func addAllChildrenViewController() { //获取命名空间 let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] guard let ns = nameSpace as? String else { return } guard titles != nil else { // JSLog.error("error:titles must't empty") return } guard selectedImages != nil else { // JSLog.error("error:select images must't empty") return } guard images != nil else { // JSLog.error("error:default images must't empty") return } guard controllers != nil else { // JSLog.error("error:controllers must't empty") return } for (index, className) in controllers!.enumerated() { // 将类名转化为类 let cls: AnyClass? = NSClassFromString(ns + "." + className) //Swift中如果想通过一个Class来创建一个对象, 必须告诉系统这个Class的确切类型 guard let vcCls = cls as? UIViewController.Type else { JSLog.error("error:cls不能当做UIViewController") return } let vc = vcCls.init() vc.title = titles![index] vc.tabBarItem.image = UIImage(named: images![index]) vc.tabBarItem.selectedImage = UIImage(named: selectedImages![index]) if #available(iOS 11, *) { let nav = JSNavigationController(navigationBarClass: InsetNavigationBar.self, toolbarClass: UIToolbar.self) nav.setViewControllers([vc], animated: false) self.addChild(nav) } else { let nav = JSNavigationController(rootViewController: vc) self.addChild(nav) } } } /// 移除所有的控制器 open func removeAllChildrenViewController() { if let vcs = self.viewControllers { for vc in vcs { vc.removeFromParent() } } } /// 重载所有的控制器 open func reloadAllChildrenViewController() { removeAllChildrenViewController() addAllChildrenViewController() } func setTabBarApperance() { //self.tabBar.barTintColor = UIColor.white //背景色 //self.tabBar.tintColor = UIColor.blue //文字颜色 } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSUIGlobal.swift ================================================ // // JSUIGloable.swift // BeeFun // // Created by WengHengcong on 2017/3/18. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSUIGlobal: NSObject { } /************************************常用UI高度**********************************/ /// 状态栏高度20 let uiStatusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height /// 导航栏高度44 let uiNavigationBarHeight: CGFloat = 44.0 /// 顶部高度=64 let uiTopBarHeight: CGFloat = uiStatusBarHeight + uiNavigationBarHeight /// 底部tabbar高度 //let uiTabBarHeight: CGFloat = 49.0 //作废,采用下面iPhone X/iOS 11中的新值 /// 键盘高度 let uiKeyboardHeight: CGFloat = 20.0 /// 距离顶部的point let uiTopPoint = CGPoint(x: 0, y: uiTopBarHeight) /// 除去导航栏和tab栏可见的屏幕高度 let uiScreenHightWithoutTopAndTab = ScreenSize.height - uiTopBarHeight - uiTabBarHeight /// Label Cell左边距 15 let uiCellLabelLeftMargin: CGFloat = 15.0 /// Label Cell右边距 15 let uiCellLabelRightMargin: CGFloat = 15.0 /// Image Cell左边距 60 let uiCellImageLeftMargin: CGFloat = 60.0 /************************************iPhone X/iOS 11**********************************/ /// 底部home indicator 高度34 let uiSafeAreaBottom: CGFloat = ScreenSize.screen5_8Inch ? 34.0 : 0 /// 纯粹的底部tabbar的高度 let uiPureTabBarHeight: CGFloat = 49.0 /// 底部tabbar高度 let uiTabBarHeight: CGFloat = uiPureTabBarHeight + uiSafeAreaBottom ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSUIKit.swift ================================================ // // JSUIKit.swift // LoveYou // // Created by WengHengcong on 2017/3/13. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class JSUIKit: NSObject { } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/JSViewController.swift ================================================ // // JSViewController.swift // LoveYou // // Created by WengHengcong on 2016/10/31. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class JSViewController: UIViewController, UIGestureRecognizerDelegate { var topOffset: CGFloat = 64.0 var leftItem: UIButton? { didSet { if let left = leftItem { setLeftBarItem(left) } } } var rightItem: UIButton? { didSet { if let right = rightItem { setRightBarItem(right) } } } var leftItemImage: UIImage? { didSet { leftItem!.setImage(leftItemImage, for: UIControl.State()) } } var leftItemSelImage: UIImage? { didSet { leftItem!.setImage(leftItemSelImage, for: .selected) } } var rightItemImage: UIImage? { didSet { rightItem!.setImage(rightItemImage, for: UIControl.State()) } } var rightItemSelImage: UIImage? { didSet { rightItem!.setImage(rightItemSelImage, for: .selected) } } override func viewDidLoad() { super.viewDidLoad() customView() } func customView() { self.view.backgroundColor = UIColor.bfViewBackgroundColor //下面语句添加在CPBaseNavigationController中无效 self.navigationController?.navigationBar.barTintColor = UIColor.bfRedColor self.navigationController?.navigationBar.titleTextAttributes = BFStyleGuide.navTitleTextAttributes() //返回按钮颜色与文字 self.navigationController?.navigationBar.tintColor = UIColor.white //启用滑动返回(swipe back) self.navigationController?.interactivePopGestureRecognizer!.delegate = self customLeftItem() customRightItem() } func customLeftItem() { leftItem = UIButton() leftItem!.setImage(UIImage(named: "arrow_left"), for: UIControl.State()) leftItem!.setImage(UIImage(named: "arrow_left"), for: .selected) leftItem!.frame = CGRect(x: 0, y: 5, width: 25, height: 25) leftItem!.addTarget(self, action: #selector(JSViewController.navigationShouldPopOnBackButton), for: .touchUpInside) leftItem!.isHidden = false //.... Set Right/Left Bar Button item let leftBarButton = UIBarButtonItem(customView: leftItem!) let leftSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) leftSpace.width = -8; //越小越靠左 self.navigationItem.leftBarButtonItems = [leftSpace, leftBarButton] } func customRightItem() { rightItem = UIButton() rightItem!.frame = CGRect(x: 0, y: 5, width: 25, height: 25) rightItem!.addTarget(self, action: #selector(JSViewController.rightItemAction(_:)), for: .touchUpInside) rightItem!.isHidden = true //.... Set Right/Left Bar Button item let rightBarButton = UIBarButtonItem(customView: rightItem!) let rightSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) rightSpace.width = -8; //越小越靠右 self.navigationItem.rightBarButtonItems = [rightSpace, rightBarButton] } func setLeftBarItem(_ left: UIButton) { //.... Set Right/Left Bar Button item let leftBarButton = UIBarButtonItem(customView: left) let leftSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) leftSpace.width = -8; //越小越靠左 self.navigationItem.leftBarButtonItems = [leftSpace, leftBarButton] } func setRightBarItem(_ right: UIButton) { let rightBarButton = UIBarButtonItem(customView: right) let rightSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) rightSpace.width = -8; //越小越靠右 self.navigationItem.rightBarButtonItems = [rightSpace, rightBarButton] } } extension JSViewController : NavigationControllerBackButtonDelegate { @objc func navigationShouldPopOnBackButton() -> Bool { leftItemAction(leftItem!) return false } func leftItemAction(_ sender: UIButton?) { } @objc func rightItemAction(_ sender: UIButton?) { } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/NSMutableAttributedString.swift ================================================ // // NSMutableAttributedString.swift // BeeFun // // Created by WengHengcong on 2017/4/14. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension NSMutableAttributedString { /// 设置文本subString的颜色 /// /// - Parameters: /// - sub: 文本中需要设置颜色的子文本 /// - color: 颜色 func setSubstringColor(_ sub: String, color: UIColor) { let range = self.mutableString.range(of: sub, options:NSString.CompareOptions.caseInsensitive) if range.location != NSNotFound { self.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range) } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/README.md ================================================ ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIAlertController+Extension.swift ================================================ // // UIAlertController.swift // BeeFun // // Created by WengHengcong on 06/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import AudioToolbox extension UIAlertController { /// Present alert view controller in the current view controller. /// /// - Parameters: /// - animated: set true to animate presentation of alert controller (default is true). /// - vibrate: set true to vibrate the device while presenting the alert (default is false). /// - completion: an optional completion handler to be called after presenting alert controller (default is nil). public func show(animated: Bool = true, vibrate: Bool = false, completion: (() -> Void)? = nil) { UIApplication.shared.keyWindow?.rootViewController?.present(self, animated: animated, completion: completion) if vibrate { AudioServicesPlayAlertSound(kSystemSoundID_Vibrate) } } /// Add an action to Alert /// /// - Parameters: /// - title: action title /// - style: action style (default is UIAlertActionStyle.default) /// - handler: optional action handler to be called when button is tapped (default is nil) /// - Returns: action created by this method @discardableResult public func addAction(title: String, style: UIAlertAction.Style = .default, handler: ((UIAlertAction) -> Void)? = nil) -> UIAlertAction { let action = UIAlertAction(title: title, style: style, handler: handler) addAction(action) return action } /// Add a text field to Alert /// /// - Parameters: /// - text: text field text (default is nil) /// - placeholder: text field placeholder text (default is nil) /// - editingChangedTarget: an optional target for text field's editingChanged /// - editingChangedSelector: an optional selector for text field's editingChanged public func addTextField(text: String? = nil, placeholder: String? = nil, editingChangedTarget: Any?, editingChangedSelector: Selector?) { addTextField { tf in tf.text = text tf.placeholder = placeholder if let target = editingChangedTarget, let selector = editingChangedSelector { tf.addTarget(target, action: selector, for: .editingChanged) } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIColor+Extension.swift ================================================ // // UIColor+.swift // LoveYou // // Created by WengHengcong on 2017/3/8. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension UIColor { // MARK: - init public convenience init(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1) { self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a) } public convenience init?(hex: String, alpha: CGFloat = 1.0) { var formatted = hex.replacingOccurrences(of: "0x", with: "") formatted = formatted.replacingOccurrences(of: "#", with: "") if let hex = Int(formatted, radix: 16) { let red = CGFloat(CGFloat((hex & 0xFF0000) >> 16)/255.0) let green = CGFloat(CGFloat((hex & 0x00FF00) >> 8)/255.0) let blue = CGFloat(CGFloat((hex & 0x0000FF) >> 0)/255.0) self.init(red: red, green: green, blue: blue, alpha: alpha) } else { return nil } } public convenience init(gray: CGFloat, alpha: CGFloat = 1) { self.init(red: gray/255, green: gray/255, blue: gray/255, alpha: alpha) } // MARK: - Class funcs public class func hex(_ hexStr: String, alpha: CGFloat = 1.0) -> UIColor { if let color = UIColor(hex: hexStr, alpha: alpha) { return color } return UIColor.clear } public class func gray(gray: CGFloat, alpha: CGFloat = 1) -> UIColor { return UIColor.init(gray: gray) } // MARK: - component public var redComponent: Int { var r: CGFloat = 0 getRed(&r, green: nil, blue: nil, alpha: nil) return Int(r * 255) } public var greenComponent: Int { var g: CGFloat = 0 getRed(nil, green: &g, blue: nil, alpha: nil) return Int(g * 255) } public var blueComponent: Int { var b: CGFloat = 0 getRed(nil, green: nil, blue: &b, alpha: nil) return Int(b * 255) } public var alpha: CGFloat { var a: CGFloat = 0 getRed(nil, green: nil, blue: nil, alpha: &a) return a } public static func random(randomAlpha: Bool = false) -> UIColor { let randomRed = CGFloat.random() let randomGreen = CGFloat.random() let randomBlue = CGFloat.random() let alpha = randomAlpha ? CGFloat.random() : 1.0 return UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: alpha) } } private extension CGFloat { /// SwiftRandom extension static func random(_ lower: CGFloat = 0, _ upper: CGFloat = 1) -> CGFloat { return CGFloat(Float(arc4random()) / Float(UINT32_MAX)) * (upper - lower) + lower } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIDevice+Device.swift ================================================ // // UIDevice+.swift // LoveYou // // Created by WengHengcong on 2017/3/8. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit // See device model: https://www.theiphonewiki.com/wiki/Models extension UIDevice { // MARK: - Device Series public enum Series: String { case iPhone case iPad case iPod case AppleTV case AppleWatch case HomePod case AirPods case Simulator case Unknown } /// Device Serises static public func isPad() -> Bool { return series() == .iPad } static public func isPhone() -> Bool { return series() == .iPhone } static public func isPod() -> Bool { return series() == .iPod } static public func isSimulator() -> Bool { return series() == .Simulator } static fileprivate func getSeries(code: String) -> UIDevice.Series { let versionCode = model() switch versionCode { case "iPhone3,1", "iPhone3,2", "iPhone3,3", "iPhone4,1", "iPhone4,2", "iPhone4,3", "iPhone5,1", "iPhone5,2", "iPhone5,3", "iPhone5,4", "iPhone6,1", "iPhone6,2", "iPhone7,2", "iPhone7,1", "iPhone8,1", "iPhone8,2", "iPhone8,4", "iPhone9,1", "iPhone9,3", "iPhone9,2", "iPhone9,4", "iPhone10,1", "iPhone10,4", "iPhone10,2", "iPhone10,5", "iPhone10,3", "iPhone10,6": return UIDevice.Series.iPhone case "iPad1,1", "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4", "iPad3,1", "iPad3,2", "iPad3,3", "iPad3,4", "iPad3,5", "iPad3,6", "iPad4,1", "iPad4,2", "iPad4,3", "iPad5,3", "iPad5,4", "iPad2,5", "iPad2,6", "iPad2,7", "iPad4,4", "iPad4,5", "iPad4,6", "iPad4,7", "iPad4,8", "iPad4,9", "iPad5,1", "iPad5,2", "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8", "iPad6,11", "iPad6,12", "iPad6,11", "iPad6,12", "iPad7,3", "iPad7,4": return UIDevice.Series.iPad case "iPod1,1", "iPod2,1", "iPod3,1", "iPod4,1", "iPod5,1", "iPod7,1": return UIDevice.Series.iPod case "AppleTV2,1", "AppleTV3,1", "AppleTV3,2", "AppleTV5,3","AppleTV6,2": return UIDevice.Series.AppleTV case "Watch1,1", "Watch1,2","Watch2,6", "Watch2,7", "Watch2,3", "Watch2,4", "Watch3,1", "Watch3,2", "Watch3,3","Watch3,4": return UIDevice.Series.AppleWatch case "AudioAccessory1,1": return UIDevice.Series.HomePod case "AirPods1,1": return UIDevice.Series.AirPods case "i386", "x86_64": return UIDevice.Series.Simulator default: return UIDevice.Series.Unknown } } static public func series() -> Series { let versionName = model() return getSeries(code: versionName) } // MARK: - Device Version public enum Version: String { /*** iPhone ***/ case iPhone4 case iPhone4S case iPhone5 case iPhone5C case iPhone5S case iPhone6 case iPhone6Plus case iPhone6S case iPhone6SPlus case iPhoneSE case iPhone7 case iPhone7Plus case iPhone7S case iPhone7SPlus case iPhone8 case iPhone8Plus case iPhoneX /*** iPad ***/ case iPad1 case iPad2 case iPadMini case iPad3 case iPad4 case iPadAir case iPadMini2 case iPadAir2 case iPadMini3 case iPadMini4 case iPadPro9_7 case iPadPro12_9 case iPad5 case iPadPro12_9_2 case iPadPro10_5 /*** iPod ***/ case iPodTouch1Gen case iPodTouch2Gen case iPodTouch3Gen case iPodTouch4Gen case iPodTouch5Gen case iPodTouch6Gen /*** Apple TV ***/ case AppleTV2 case AppleTV3 case AppleTV4 case AppleTV4K /*** Apple Watch ***/ case Watch1 case WatchSeries1 case WatchSeries2 case WatchSeries3 /*** Simulator ***/ case Simulator /*** HomePod ***/ case HomePod /*** AirPods ***/ case AirPods /*** Unknown ***/ case Unknown } static let iPhone4Series: [Version] = [.iPhone4, .iPhone4S] static let iPhone5Series: [Version] = [.iPhone5, .iPhone5C, .iPhone5S] static let iPhone6Series: [Version] = [.iPhone6, .iPhone6S] static let iPhone6PlusSeries: [Version] = [.iPhone6Plus, .iPhone6SPlus] static let iPhoneSESeries: [Version] = [.iPhoneSE] static let iPhone7Series: [Version] = [.iPhone7, .iPhone7S] static let iPhone7PlusSeries: [Version] = [.iPhone7Plus, .iPhone7SPlus] static let iPhone8Series: [Version] = [.iPhone8] static let iPhone8PlusSeries: [Version] = [.iPhone8Plus] static let iPhoneXSeries: [Version] = [.iPhoneX] /// Device Model static public func model() -> String { var systemInfo = utsname() uname(&systemInfo) let machine = systemInfo.machine var identifier = "" let mirror = Mirror(reflecting: machine) for child in mirror.children { let value = child.value if let value = value as? Int8, value != 0 { identifier.append(String(UnicodeScalar(UInt8(value)))) } } return identifier } public static func modelReadable() -> Version { return getVersion(code: model()) } static fileprivate func getVersion(code: String) -> Version { switch code { /*** iPhone ***/ case "iPhone3,1", "iPhone3,2", "iPhone3,3": return Version.iPhone4 case "iPhone4,1", "iPhone4,2", "iPhone4,3": return Version.iPhone4S case "iPhone5,1", "iPhone5,2": return Version.iPhone5 case "iPhone5,3", "iPhone5,4": return Version.iPhone5C case "iPhone6,1", "iPhone6,2": return Version.iPhone5S case "iPhone7,2": return Version.iPhone6 case "iPhone7,1": return Version.iPhone6Plus case "iPhone8,1": return Version.iPhone6S case "iPhone8,2": return Version.iPhone6SPlus case "iPhone8,4": return Version.iPhoneSE case "iPhone9,1", "iPhone9,3": return Version.iPhone7 case "iPhone9,2", "iPhone9,4": return Version.iPhone7Plus case "iPhone10,1", "iPhone10,4": return Version.iPhone8 case "iPhone10,2", "iPhone10,5": return Version.iPhone8Plus case "iPhone10,3", "iPhone10,6": return Version.iPhoneX /*** iPad ***/ case "iPad1,1": return Version.iPad1 case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4": return Version.iPad2 case "iPad3,1", "iPad3,2", "iPad3,3": return Version.iPad3 case "iPad3,4", "iPad3,5", "iPad3,6": return Version.iPad4 case "iPad4,1", "iPad4,2", "iPad4,3": return Version.iPadAir case "iPad5,3", "iPad5,4": return Version.iPadAir2 case "iPad2,5", "iPad2,6", "iPad2,7": return Version.iPadMini case "iPad4,4", "iPad4,5", "iPad4,6": return Version.iPadMini2 case "iPad4,7", "iPad4,8", "iPad4,9": return Version.iPadMini3 case "iPad5,1", "iPad5,2": return Version.iPadMini4 case "iPad6,3", "iPad6,4": return Version.iPadPro9_7 case "iPad6,7", "iPad6,8": return Version.iPadPro12_9 case "iPad6,11", "iPad6,12": return Version.iPad5 case "iPad7,1", "iPad7,2": return Version.iPadPro12_9_2 case "iPad7,3", "iPad7,4": return Version.iPadPro12_9_2 /*** iPod ***/ case "iPod1,1": return Version.iPodTouch1Gen case "iPod2,1": return Version.iPodTouch2Gen case "iPod3,1": return Version.iPodTouch3Gen case "iPod4,1": return Version.iPodTouch4Gen case "iPod5,1": return Version.iPodTouch5Gen case "iPod7,1": return Version.iPodTouch6Gen /*** Apple TV ***/ case "AppleTV2,1": return Version.AppleTV2 case "AppleTV3,1", "AppleTV3,2": return Version.AppleTV3 case "AppleTV5,3": return Version.AppleTV4 case "AppleTV6,2": return Version.AppleTV4K /*** Apple Watch ***/ case "Watch1,1", "Watch1,2": return Version.Watch1 case "Watch2,6", "Watch2,7": return Version.WatchSeries1 case "Watch2,3", "Watch2,4": return Version.WatchSeries2 case "Watch3,1", "Watch3,2", "Watch3,3", "Watch3,4": return Version.WatchSeries3 /*** HomePod ***/ case "AudioAccessory1,1": return Version.HomePod /*** AirPods ***/ case "AirPods1,1": return Version.AirPods /*** Simulator ***/ case "i386", "x86_64": return Version.Simulator default: return Version.Unknown } } // MARK: - Other device information /// Device name public static func name() -> String { return UIDevice.current.name } /// Device language public static func language() -> String { return Bundle.main.preferredLocalizations[0] } /// - UUID public static func uuid() -> String? { return UIDevice.current.identifierForVendor?.uuidString } /// - Operating system name public static func systemName() -> String { return UIDevice.current.systemName } public static func isPortrait() -> Bool { return UIDevice.current.orientation.isPortrait } public static func isLandscape() -> Bool { return UIDevice.current.orientation.isLandscape } } extension UIDevice { // MARK: - Device Version struct iOS { public enum Version: Float { case seven = 7.0 case eight = 8.0 case nine = 9.0 case ten = 10.0 case eleven = 11.0 } /// - Operating system version public static func systemVersion() -> String { return UIDevice.current.systemVersion } /// - Operating system version public static func systemFloatVersion() -> Float { return (systemVersion() as NSString).floatValue } public static func equal(_ version: Version) -> Bool { return systemFloatVersion() >= version.rawValue && systemFloatVersion() < (version.rawValue + 1.0) } public static func equalOrLater(_ version: Version) -> Bool { return systemFloatVersion() >= version.rawValue } public static func equalOrEarlier(_ version: Version) -> Bool { return systemFloatVersion() < (version.rawValue + 1.0) } public static var current: String { return "\(systemFloatVersion())" } /// static fileprivate func isSystemVersionOver(_ requiredVersion: String) -> Bool { switch systemVersion().compare(requiredVersion, options: NSString.CompareOptions.numeric) { case .orderedSame, .orderedDescending: //println("iOS >= 8.0") return true case .orderedAscending: //println("iOS < 8.0") return false } } } struct Battery { /** This enum describes the state of the battery. - Full: The device is plugged into power and the battery is 100% charged or the device is the iOS Simulator. - Charging: The device is plugged into power and the battery is less than 100% charged. - Unplugged: The device is not plugged into power; the battery is discharging. */ public enum State: CustomStringConvertible, Equatable { /// The device is plugged into power and the battery is 100% charged or the device is the iOS Simulator. case full /// The device is plugged into power and the battery is less than 100% charged. /// The associated value is in percent (0-100). case charging(Int) /// The device is not plugged into power; the battery is discharging. /// The associated value is in percent (0-100). case unplugged(Int) fileprivate init() { UIDevice.current.isBatteryMonitoringEnabled = true let batteryLevel = Int(round(UIDevice.current.batteryLevel * 100)) // round() is actually not needed anymore since -[batteryLevel] seems to always return a two-digit precision number // but maybe that changes in the future. switch UIDevice.current.batteryState { case .charging: self = .charging(batteryLevel) case .full: self = .full case .unplugged:self = .unplugged(batteryLevel) case .unknown: self = .full // Should never happen since `batteryMonitoring` is enabled. } UIDevice.current.isBatteryMonitoringEnabled = false } public var description: String { switch self { case .charging(let batteryLevel): return "Battery level: \(batteryLevel)%, device is plugged in." case .full: return "Battery level: 100 % (Full), device is plugged in." case .unplugged(let batteryLevel): return "Battery level: \(batteryLevel)%, device is unplugged." } } static public func == (lhs: State, rhs: State) -> Bool { return lhs.description == rhs.description } static public func < (lhs: State, rhs: State) -> Bool { switch (lhs, rhs) { case (.full, _): return false // return false (even if both are `.Full` -> they are equal) case (_, .full): return true // lhs is *not* `.Full`, rhs is case (.charging(let lhsLevel), .charging(let rhsLevel)): return lhsLevel < rhsLevel case (.charging(let lhsLevel), .unplugged(let rhsLevel)): return lhsLevel < rhsLevel case (.unplugged(let lhsLevel), .charging(let rhsLevel)): return lhsLevel < rhsLevel case (.unplugged(let lhsLevel), .unplugged(let rhsLevel)): return lhsLevel < rhsLevel default: return false // compiler won't compile without it, though it cannot happen } } } /// The state of the battery public var state: State { return State() } /// Battery level ranges from 0 (fully discharged) to 100 (100% charged). public var level: Int { switch State() { case .charging(let value): return value case .full: return 100 case .unplugged(let value): return value } } } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIImage+Extension.swift ================================================ // // UIImage+Extension.swift // BeeFun // // Created by WengHengcong on 2017/3/29. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit public enum JSImageFormat { case unknown, png, jpeg, gif } extension UIImage { /// EZSE: Returns base64 string var base64: String { return self.jpegData(compressionQuality: 1.0)!.base64EncodedString() } /// EZSE: Returns compressed image to rate from 0 to 1 /// 以JPEG压缩图片 /// /// - Parameter rate: 压缩比 /// - Returns: 返回图片时的Data public func compressImage(rate: CGFloat) -> Data? { return self.jpegData(compressionQuality: rate) } /// EZSE: Returns Image size in Bytes /// 返回图片的大小 /// /// - Returns: byte public func getSizeAsBytes() -> Int { return self.jpegData(compressionQuality: 1)?.count ?? 0 } /// 返回图片的大小 /// /// - Returns: kb public func getSizeAsKilobytes() -> Int { let sizeAsBytes = getSizeAsBytes() return sizeAsBytes != 0 ? sizeAsBytes / 1024 : 0 } /// EZSE: scales image /// 缩放图片 /// /// - Parameters: /// - image: 需要缩放的图片 /// - w: 宽度 /// - h: 高度 /// - Returns: 压缩后图片 public class func scaleTo(image: UIImage, w: CGFloat, h: CGFloat) -> UIImage { let newSize = CGSize(width: w, height: h) UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage } /// EZSE Returns resized image with width. Might return low quality /// 重置图片大小 /// /// - Parameter width: 宽度 /// - Returns: <#return value description#> public func resizeWithWidth(_ width: CGFloat) -> UIImage { let aspectSize = CGSize (width: width, height: aspectHeightForWidth(width)) UIGraphicsBeginImageContext(aspectSize) self.draw(in: CGRect(origin: CGPoint.zero, size: aspectSize)) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img! } /// 重置图片大小 /// /// - Parameter height: 高度 /// - Returns: <#return value description#> public func resizeWithHeight(_ height: CGFloat) -> UIImage { let aspectSize = CGSize (width: aspectWidthForHeight(height), height: height) UIGraphicsBeginImageContext(aspectSize) self.draw(in: CGRect(origin: CGPoint.zero, size: aspectSize)) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img! } /// 自适应高度 /// /// - Parameter width: 宽度 /// - Returns: <#return value description#> public func aspectHeightForWidth(_ width: CGFloat) -> CGFloat { return (width * self.size.height) / self.size.width } /// 自适应宽度 /// /// - Parameter height: 高度 /// - Returns: <#return value description#> public func aspectWidthForHeight(_ height: CGFloat) -> CGFloat { return (height * self.size.width) / self.size.height } /// 截图 /// /// - Parameter bound: 截图区域 /// - Returns: <#return value description#> public func croppedImage(_ bound: CGRect) -> UIImage? { guard self.size.width > bound.origin.x else { print("JSUI: Your cropping X coordinate is larger than the image width") return nil } guard self.size.height > bound.origin.y else { print("JSUI: Your cropping Y coordinate is larger than the image height") return nil } let scaledBounds: CGRect = CGRect(x: bound.x * self.scale, y: bound.y * self.scale, width: bound.w * self.scale, height: bound.h * self.scale) let imageRef = self.cgImage?.cropping(to: scaledBounds) let croppedImage: UIImage = UIImage(cgImage: imageRef!, scale: self.scale, orientation: UIImage.Orientation.up) return croppedImage } ///根据颜色创建图片 public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.cgImage else { return nil } self.init(cgImage: cgImage) } ///根据URL加载新图片 public convenience init?(urlString: String) { guard let url = URL(string: urlString) else { self.init(data: Data()) return } guard let data = try? Data(contentsOf: url) else { print("EZSE: No image in URL \(urlString)") self.init(data: Data()) return } self.init(data: data) } /// 空图片 /// /// - Returns: <#return value description#> public class func blankImage() -> UIImage { UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0.0) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UILabel+Extension.swift ================================================ // // UILabel+Extension.swift // BeeFun // // Created by WengHengcong on 2017/4/14. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension UILabel { /// 初始化方法 /// /// - Parameters: /// - fontSize: 字体大小 /// - align: 对齐方式 /// - mutiple: 是否显示多行 convenience init(size fontSize: CGFloat, align: NSTextAlignment, mutiple: Bool) { self.init() font = UIFont.systemFont(ofSize: fontSize) textAlignment = align if mutiple { numberOfLines = 0 } } /// 初始化方法 /// /// - Parameters: /// - fontSize: 字体大小 /// - mutiple: 是否显示多行 convenience init(size fontSize: CGFloat, mutiple: Bool) { self.init(size: fontSize, align: .left, mutiple: mutiple) } /// 设置文本中subString中的颜色 /// /// - Parameters: /// - subText: 指定文本 /// - color: 该文本需要设置的颜色 func setSubTextColor(_ subText: String, color: UIColor) { let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!) let range = attributedString.mutableString.range(of: subText, options:NSString.CompareOptions.caseInsensitive) if range.location != NSNotFound { attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range) } self.attributedText = attributedString } /// 设置字体大小自适应 /// /// - Parameter factor: 最小的缩小倍数 func adjustFontSizeToFitWidth(minScale factor: CGFloat) { self.adjustsFontSizeToFitWidth = true self.minimumScaleFactor = factor } /// 设置字体大小自适应 /// /// - Parameter fontsize: 最小的字体大小 func adjustFontSizeToFitWidth(minFont fontsize: CGFloat) { let scale = fontsize/self.font.pointSize adjustFontSizeToFitWidth(minScale: scale) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UILabel+Size.swift ================================================ // // UILabel+Size.swift // LoveYou // // Created by WengHengcong on 2017/3/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension UILabel { /// UILabel文本的高度:宽度是UILabel中原有的宽度 var requiredHeight: CGFloat { let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: .greatestFiniteMagnitude)) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.byWordWrapping label.font = self.font label.text = self.text label.sizeToFit() return label.frame.height } /// UILabel文本的高度 /// /// - Parameter width: 宽度 func requiredHeight(w: CGFloat) -> CGFloat { let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: w, height: .greatestFiniteMagnitude)) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.byWordWrapping label.font = self.font label.text = self.text label.sizeToFit() return label.frame.height } /// UILabel文本的宽度:宽度是UILabel中原有的高度 var requiredWidth: CGFloat { let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: .greatestFiniteMagnitude, height:height )) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.byWordWrapping label.font = self.font label.text = self.text label.sizeToFit() return label.frame.width } /// UILabel文本的宽度 /// /// - Parameter width: 高度 func requiredWidth(h: CGFloat) -> CGFloat { let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: .greatestFiniteMagnitude, height:h )) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.byWordWrapping label.font = self.font label.text = self.text label.sizeToFit() return label.frame.width } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UINavigationController+Pop.swift ================================================ // // UINavigationController+Pop.swift // LoveYou // // Created by WengHengcong on 2017/3/8. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit fileprivate func < (lhs: T?, rhs: T?) -> Bool { switch (lhs, rhs) { case let (l?, r?): return l < r case (nil, _?): return true default: return false } } protocol NavigationControllerBackButtonDelegate: class { func navigationShouldPopOnBackButton() -> Bool } extension UINavigationController { func navigationBar(_ navigationBar: UINavigationBar, shouldPopItem item: UINavigationItem) -> Bool { // Prevents from a synchronization issue of popping too many navigation items // and not enough view controllers or viceversa from unusual tapping if self.viewControllers.count < navigationBar.items?.count { return true } // Check if we have a view controller that wants to respond to being popped var shouldPop = true if let viewController = self.topViewController as? NavigationControllerBackButtonDelegate { shouldPop = viewController.navigationShouldPopOnBackButton() } if shouldPop { DispatchQueue.main.async { self.popViewController(animated: true) } } else { // Prevent the back button from staying in an disabled state for view in navigationBar.subviews where view.alpha < 1.0 { UIView.animate(withDuration: 0.25, animations: { view.alpha = 1.0 }) } } return false } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIScreen+Size.swift ================================================ // // JSScreen.swift // LoveYou // // Created by WengHengcong on 2016/11/11. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit //设计稿全部以iPhone 5尺寸设计 func designBy3_5Inch(_ x: CGFloat) -> CGFloat { let scale = ( (UIScreen.width) / CGFloat(320.0) ) let result = scale * x return result } //设计稿全部以iPhone 6尺寸设计 func designBy4_7Inch(_ x: CGFloat) -> CGFloat { let scale = ( (UIScreen.width) / CGFloat(375.0) ) let result = scale * x return result } //设计稿全部以iPhone 6 Plus尺寸设计 func designBy5_5Inch(_ x: CGFloat) -> CGFloat { let scale = ( (UIScreen.width) / CGFloat(414.0) ) let result = scale * x return result } //设计稿全部以iPhone X尺寸设计 func designBy5_8Inch(_ x: CGFloat) -> CGFloat { let scale = ( (UIScreen.width) / CGFloat(375) ) let result = scale * x return result } extension UIScreen { public enum Size: Int { case unknownSize = 0 //Watch case screen1_32Inch //272*340 case screen1_5Inch //312*390 //iPhone case screen3_5Inch //320*480 case screen4_0Inch //320*568 case screen4_7Inch //375*667 case screen5_5Inch //414*736 case screen5_8Inch //375*812 //iPad case screen7_9Inch //768*1024 case screen9_7Inch //768*1024 case screen10_5Incn //834*1112 case screen12_9Inch //1024*1366 } static public func sizeByInch() -> Size { let w: Double = Double(UIScreen.main.bounds.width) let h: Double = Double(UIScreen.main.bounds.height) let screenHeight: Double = max(w, h) switch screenHeight { case 480: return Size.screen3_5Inch case 568: return Size.screen4_0Inch case 667: return Size.screen4_7Inch case 736: return Size.screen5_5Inch case 812: return Size.screen5_8Inch case 1024: switch UIDevice.modelReadable() { case .iPadMini, .iPadMini2, .iPadMini3, .iPadMini4: return Size.screen7_9Inch default: return Size.screen9_7Inch } case 1366: return Size.screen12_9Inch default: return Size.unknownSize } } // MARK: properties /// 屏幕scale(避免与scale冲突) static let screenScale = UIScreen.scale() /// 是否是retina屏幕 static let isRetina = UIScreen.scale() > 1.0 /// 屏幕bound(去掉s,避免与bounds冲突) static let bound = UIScreen.bounds() /// 屏幕Size static let size = UIScreen.bound.size /// 屏幕width static let width = UIScreen.size.width /// 屏幕height static let height = UIScreen.size.height /// 返回屏幕bounds /// /// - Returns: <#return value description#> public static func bounds() -> CGRect { return UIScreen.main.bounds } /// 返回屏幕scale /// /// - Returns: <#return value description#> public static func scale() -> CGFloat { return UIScreen.main.scale } // MAEK: size compare static public func isEqual(_ size: Size) -> Bool { return size == UIScreen.sizeByInch() ? true : false } static public func isLargerThan(_ size: Size) -> Bool { return size.rawValue < UIScreen.sizeByInch().rawValue ? true : false } static public func isSmallerThan(_ size: Size) -> Bool { return size.rawValue > UIScreen.sizeByInch().rawValue ? true : false } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIStoryboard+Extension.swift ================================================ // // UIStoryboard+Extension.swift // BeeFun // // Created by WengHengcong on 2017/3/19. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension UIStoryboard { class func reloadInstantiateInitialViewController(storyboard: String) -> UIViewController? { let storyboardName = "Main" let storyboard = UIStoryboard(name: storyboardName, bundle: nil) return storyboard.instantiateInitialViewController() } class func reloadView(storyboard: String, view: String) -> UIViewController { let storyboard = UIStoryboard(name:storyboard, bundle: nil) return storyboard.instantiateViewController(withIdentifier:view) } class func reloadViewInMainStoryboard(view: String) -> UIViewController { let storyboard = UIStoryboard(name:"Main", bundle: nil) return storyboard.instantiateViewController(withIdentifier:view) } class func storybard(name: String) -> UIStoryboard { return UIStoryboard(name: name, bundle: nil) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UITextField+Extension.swift ================================================ // // UITextField+Extension.swift // BeeFun // // Created by WengHengcong on 16/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit extension UITextField { /// 设置字体大小自适应 /// /// - Parameter fontsize: 最小的字体大小 func adjustFontSizeToFitWidth(minFont fontsize: CGFloat) { self.adjustsFontSizeToFitWidth = true self.minimumFontSize = fontsize } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIView+Draw.swift ================================================ // // UIView+Draw.swift // LoveYou // // Created by WengHengcong on 2017/3/8. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit // MARK: - Position extension UIView { var width: CGFloat { get { return self.frame.size.width } set { self.frame.size.width = newValue } } var height: CGFloat { get { return self.frame.size.height } set { self.frame.size.height = newValue } } var size: CGSize { get { return self.frame.size } set { self.frame.size = newValue } } var origin: CGPoint { get { return self.frame.origin } set { self.frame.origin = newValue } } var x: CGFloat { get { return self.frame.origin.x } set { self.frame.origin = CGPoint(x: newValue, y: self.frame.origin.y) } } var y: CGFloat { get { return self.frame.origin.y } set { self.frame.origin = CGPoint(x: self.frame.origin.x, y: newValue) } } var centerX: CGFloat { get { return self.center.x } set { self.center = CGPoint(x: newValue, y: self.center.y) } } var centerY: CGFloat { get { return self.center.y } set { self.center = CGPoint(x: self.center.x, y: newValue) } } var left: CGFloat { get { return self.frame.origin.x } set { self.frame.origin.x = newValue } } var right: CGFloat { get { return self.frame.origin.x + self.frame.size.width } set { self.frame.origin.x = newValue - self.frame.size.width } } var top: CGFloat { get { return self.frame.origin.y } set { self.frame.origin.y = newValue } } var bottom: CGFloat { get { return self.frame.origin.y + self.frame.size.height } set { self.frame.origin.y = newValue - self.frame.size.height } } } // MARK: - Calculator poisiton extension UIView { /// 计算控件相对于屏幕的左边距 /// /// - Parameter width: 控件宽度 /// - Returns: 控件距离屏幕左边距 class func xSpace(width: CGFloat) -> CGFloat { return self.xSpace(width: width, relative: ScreenSize.width) } /// 计算控件相对于父视图的左边距 /// /// - Parameters: /// - width: 控件宽度 /// - full: 父视图的整体宽度 /// - Returns: 控件相对于父视图的左边距 class func xSpace(width: CGFloat, relative full: CGFloat) -> CGFloat { let leftX = (full-width)/2.0 return leftX } /// 计算控件相对于屏幕的上边距 /// /// - Parameter height: 控件高度 /// - Returns: 控件距离屏幕上边距 class func ySpace(height: CGFloat) -> CGFloat { return self.ySpace(height: height, relative: ScreenSize.height) } /// 计算控件相对于父视图的上边距 /// /// - Parameters: /// - height: 控件高度 /// - full: 控件父视图的整体高度 /// - Returns: 控件相对于父视图的上边距 class func ySpace(height: CGFloat, relative full: CGFloat) -> CGFloat { let topY = (full-height)/2.0 return topY } } // MARK: - Draw Layout extension UIView { /// 设置圆角 var radius: CGFloat { get { return self.layer.cornerRadius } set { self.layer.cornerRadius = newValue self.layer.masksToBounds = true } } /// 设置边框颜色 var borderColor: UIColor { get { if let color = self.layer.borderColor { return UIColor(cgColor: color) } return UIColor.white } set { self.layer.borderColor = newValue.cgColor } } /// 设置边框颜色 var borderWidth: CGFloat { get { return self.layer.borderWidth } set { self.layer.borderWidth = newValue } } /// 边框类型 /// /// - none: 不添加 /// - one: 添加单边 /// - all: 添加四边 enum BorderType { case none case one case all } /// 视图Border类型 /// /// - left: 左边框 /// - right: 右边框 /// - top: 上边框 /// - bottom: 下边框 enum ViewBorder: String { case left = "borderLeft" case right = "borderRight" case top = "borderTop" case bottom = "borderBottom" } /// 默认边框颜色 var defaultBorderColor: UIColor { get { return UIColor.bfLineBackgroundColor } set { self.defaultBorderColor = newValue } } /// 添加边框(颜色:默认,圆角:0,宽度:1px) /// /// - Parameters: /// - type: 边框类型 /// - at: 指定哪条边添加边框 func addBorder(type: BorderType, at: ViewBorder) { let width = 1.0 / (UIScreen.main.scale) addBorder(type: type, color: defaultBorderColor, radius: 0, width: width, at: at) } /// 添加边框(颜色:默认,宽度:1px) func addBorder(type: BorderType, radius: CGFloat, at: ViewBorder) { let width = 1.0 / (UIScreen.main.scale) addBorder(type: type, color: defaultBorderColor, radius: radius, width: width, at: at) } /// 添加边框(宽度:1px) func addBorder(type: BorderType, color: UIColor, radius: CGFloat, at: ViewBorder) { let width = 1.0 / (UIScreen.main.scale) addBorder(type: type, color: color, radius: radius, width: width, at: at) } /// 添加边框 /// /// - Parameters: /// - type: 边框类型 /// - color: 颜色 /// - radius: 圆角 /// - width: 宽度 /// - at: 指点哪条边 func addBorder(type: BorderType, color: UIColor, radius: CGFloat, width: CGFloat, at: ViewBorder) { switch type { case .none: break case .one: addBorderSingle(color, width: width, at: at) case .all: addBorderAround(color, radius: radius, width: width) } } /** 添加四周边框 */ func addBorderAroundInOnePixel() { self.addBorderAroundInOnePixel(defaultBorderColor, radius: 0) } /// 添加1像素四周边框 /// /// - Parameter color: 边框颜色 func addBorderAroundInOnePixel(_ color: UIColor) { self.addBorderAroundInOnePixel(color, radius: 0) } /// 添加1像素的四周边框 /// /// - Parameters: /// - color: 边框颜色 /// - radius: 边框圆角 func addBorderAroundInOnePixel(_ color: UIColor, radius: CGFloat) { let retinaPixelSize = 1.0 / (UIScreen.main.scale) self.addBorderAround(color, radius: radius, width: retinaPixelSize) } /// 添加四周边框 /// /// - Parameters: /// - color: 边框颜色 /// - radius: 边框圆角 /// - width: 边框宽度 func addBorderAround(_ color: UIColor, radius: CGFloat, width: CGFloat) { self.layer.borderWidth = width self.layer.borderColor = color.cgColor self.layer.cornerRadius = radius self.layer.masksToBounds = true } /// 添加单边边框(颜色:默认,宽度:1px) func addBorderSingle(at: ViewBorder) { let retinaPixelSize = 1.0 / (UIScreen.main.scale) addBorderSingle(defaultBorderColor, width: retinaPixelSize, at: at) } /// 添加单边边框(宽度:1px) func addBorderSingle(_ color: UIColor, at: ViewBorder) { let retinaPixelSize = 1.0 / (UIScreen.main.scale) addBorderSingle(color, width: retinaPixelSize, at: at) } /// 添加单边边框 /// /// - Parameters: /// - color: 牙呢 /// - width: 宽度 /// - at: 指定哪条边 func addBorderSingle(_ color: UIColor, width: CGFloat, at: ViewBorder) { let retinaPixelSize = 1.0 / (UIScreen.main.scale) let maxLinewidth = max(retinaPixelSize, width) let border = CALayer() border.borderColor = color.cgColor border.borderWidth = maxLinewidth border.name = at.rawValue switch at { case .top: border.frame = CGRect(x: 0, y: 0, width: self.width, height: width) break case .left: border.frame = CGRect(x: 0, y: 0, width: width, height: self.height) break case .right: border.frame = CGRect(x: self.width-width, y: 0, width: width, height: self.height) break case .bottom: border.frame = CGRect(x: 0, y: self.height-width, width: self.width, height: width) break } removeBorder(at) self.layer.addSublayer(border) } func removeBorder(_ at: ViewBorder) { var layerForRemove: CALayer? if let sublayers = self.layer.sublayers { for layer in sublayers where layer.name == at.rawValue { layerForRemove = layer } if let layer = layerForRemove { layer.removeFromSuperlayer() } } } func removeAllBorders() { removeBorder(.top) removeBorder(.left) removeBorder(.bottom) removeBorder(.right) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/JSUIKit/UIView+Nib.swift ================================================ // // JSView.swift // LoveYou // // Created by WengHengcong on 2016/11/11. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit extension UIView { static func cellFromNib(name nibName: String) -> AnyObject { var nibContents: Array = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)! let xib = nibContents[0] return xib as AnyObject } } extension UIView { /// remove all subview func removeAllSubViews() { _ = self.subviews.map({ $0.removeFromSuperview() }) } } ================================================ FILE: BeeFun/BeeFun/ToolKit/JSToolKit/README.md ================================================ ================================================ FILE: BeeFun/BeeFun/View/Base/Controller/BFBaseTabBarController.swift ================================================ // // BFBaseTabBarController.swift // BeeFun // // Created by wenghengcong on 15/12/30. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit class BFBaseTabBarController: JSTabBarController { // MARK: 初始化方法 override init() { super.init() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() titles = ["Explore".localized, "Message".localized, "Stars".localized, "Profile".localized] images = ["tab_hot", "tab_mes", "tab_star", "tab_me"] selectedImages = ["tab_hot_sel", "tab_mes_sel", "tab_star_sel", "tab_me_sel"] controllers = ["BFTrendingController", "BFMessageController", "BFStarController", "BFProfileController"] super.addAllChildrenViewController() setTabBarApperance() } override func setTabBarApperance() { super.setTabBarApperance() JSApperence.setTabbarTextColor( .black, for: .normal) JSApperence.setTabbarTextColor( .red, for: .selected) self.tabBar.barTintColor = UIColor.iOS11White //背景色 self.tabBar.tintColor = UIColor.bfTabBarTitleTextColor//文字颜色 } func getRootController(by index: Int) -> UIViewController? { if (self.viewControllers?.isBeyond(index: index))! { return nil } let viewC = self.viewControllers?[index] return viewC } func reload() { BFTabbarManager.jsAppDelegate.window?.rootViewController = BFBaseTabBarController() } //http://stackoverflow.com/questions/26667009/get-top-most-uiviewcontroller /// 返回当前顶部视图控制器 /// /// - Parameter controller: <#controller description#> /// - Returns: <#return value description#> func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let navigationController = controller as? UINavigationController { return topViewController(controller: navigationController.visibleViewController) } if let tabController = controller as? UITabBarController { if let selected = tabController.selectedViewController { return topViewController(controller: selected) } } if let presented = controller?.presentedViewController { return topViewController(controller: presented) } return controller } /// 返回当前导航栏控制器 /// /// - Returns: <#return value description#> func currentNavigationViewController() -> UINavigationController? { // let topView = topViewController() // if let tabCont = controllers?.containsType(of: topView) { // return self.navigationController // } let nav = topViewController()?.navigationController return nav } /// 返回当前顶部视图控制器 /// /// - Returns: <#return value description#> func currentViewController() -> UIViewController? { return topViewController() } func gotoTab(index: Int) { self.selectedIndex = index } } ================================================ FILE: BeeFun/BeeFun/View/Base/Controller/BFWebViewController.swift ================================================ // // BFWebViewController.swift // BeeFun // // Created by wenghengcong on 16/1/9. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import TOWebViewController class BFWebViewController: TOWebViewController { } ================================================ FILE: BeeFun/BeeFun/View/Base/ViewCell/BFBaseCell.swift ================================================ // // BFBaseCell.swift // BeeFun // // Created by wenghengcong on 16/1/17. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit class BFBaseCell: UITableViewCell { var topLineView: UIView? var botLineView: UIView? /** * 是否为完整的底部灰线 */ var fullBottomline: Bool? /** * 是否有顶部线条 */ var topline: Bool? static func cellFromNibNamed(_ nibName: String) -> AnyObject { var nibContents: Array = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)! let xibBasedCell = nibContents[0] return xibBasedCell as AnyObject } override func awakeFromNib() { super.awakeFromNib() // Initialization code p_customCellView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) p_customCellView() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func p_customCellView() { if botLineView == nil { botLineView = UIView() botLineView?.backgroundColor = UIColor.bfLineBackgroundColor self.contentView.addSubview(botLineView!) } let retinaPixelSize: CGFloat = 1 botLineView?.frame = CGRect(x: 10, y: self.contentView.height-retinaPixelSize, w: ScreenSize.width-10, h: retinaPixelSize) if topLineView == nil { topLineView = UIView() topLineView?.backgroundColor = UIColor.bfLineBackgroundColor topLineView?.frame = CGRect(x: 0, y: 0, w: ScreenSize.width, h: retinaPixelSize) self.contentView.addSubview(topLineView!) topLineView?.isHidden = true } } func setBothEndsLines(_ current: Int, all rowsOfSection: Int) { self.topline = nil self.fullBottomline = nil if current == 0 { self.topline = true } else if current > 0 { self.topline = false } if rowsOfSection > 0 { if current == rowsOfSection-1 { self.fullBottomline = true } else { self.fullBottomline = false } } self.layoutSubFrames() } func layoutSubFrames() { if topline != nil { topLineView?.isHidden = !(topline!) } if let fullBottom = fullBottomline { let retinaPixelSize: CGFloat = 0.5 if fullBottom { botLineView?.frame = CGRect(x: 0, y: self.contentView.height-retinaPixelSize, w: ScreenSize.width, h: retinaPixelSize) } else { botLineView?.frame = CGRect(x: 10, y: self.contentView.height-retinaPixelSize, w: ScreenSize.width-10, h: retinaPixelSize) } } } } ================================================ FILE: BeeFun/BeeFun/View/Base/ViewCell/BFSwipeCell.swift ================================================ // // BFSwipeCell.swift // BeeFun // // Created by WengHengcong on 20/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import SnapKit import SwipeCellKit class BFSwipeCell: SwipeTableViewCell { let topView: UIView = UIView() let botView: UIView = UIView() /** * 是否为完整的底部灰线 */ var fullBottomline: Bool? /** * 是否有顶部线条 */ var topline: Bool? static func cellFromNibNamed(_ nibName: String) -> AnyObject { var nibContents: Array = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)! let xibBasedCell = nibContents[0] return xibBasedCell as AnyObject } override func awakeFromNib() { super.awakeFromNib() // Initialization code customCellView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) customCellView() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func customCellView() { botView.backgroundColor = UIColor.bfLineBackgroundColor self.contentView.addSubview(botView) let retinaPixelSize = 1 botView.snp.remakeConstraints({ (make) -> Void in make.left.equalTo(10) make.right.equalTo(0) make.bottom.equalTo(0) make.height.equalTo(retinaPixelSize) }) topView.backgroundColor = UIColor.bfLineBackgroundColor topView.isHidden = true self.contentView.addSubview(topView) topView.snp.remakeConstraints({ (make) -> Void in make.left.equalTo(0) make.right.equalTo(0) make.top.equalTo(0) make.height.equalTo(retinaPixelSize) }) } func setBothEndsLines(_ current: Int, all rowsOfSection: Int) { self.topline = nil self.fullBottomline = nil if current == 0 { self.topline = true } else if current > 0 { self.topline = false } if rowsOfSection > 0 { if current == rowsOfSection-1 { self.fullBottomline = true } else { self.fullBottomline = false } } self.layoutSubFrames() } func layoutSubFrames() { if topline != nil { topView.isHidden = !(topline!) } if let fullBottom = fullBottomline { let retinaPixelSize: CGFloat = 0.5 if fullBottom { botView.snp.remakeConstraints({ (make) -> Void in make.left.equalTo(0) make.right.equalTo(0) make.bottom.equalTo(0.5) make.height.equalTo(retinaPixelSize) }) } else { botView.snp.remakeConstraints({ (make) -> Void in make.left.equalTo(10) make.right.equalTo(0) make.bottom.equalTo(0.5) make.height.equalTo(retinaPixelSize) }) } } } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Answer.swift ================================================ // // BFBaseViewController+Answer.swift // BeeFun // // Created by WengHengcong on 2017/4/16. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController { func gatherUserActivityInViewDidload() { let methodStr = #function AnswerManager.logContentView(name: self.title?.enLocalized ?? "Unkonwn", type: ContentViewType.uv.rawValue, id: self.className, attributes: ["method": methodStr]) } func gatherUserActivityInViewWillAppear() { let methodStr = #function AnswerManager.logContentView(name: self.title?.enLocalized ?? "Unkonwn", type: ContentViewType.pv.rawValue, id: self.className, attributes: ["method": methodStr]) } func gatherUserActivityInViewWillDisAppear() { let methodStr = #function AnswerManager.logContentView(name: self.title?.enLocalized ?? "Unkonwn", type: ContentViewType.tm.rawValue, id: self.className, attributes: ["method": methodStr]) } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Empty.swift ================================================ // // BFBaseViewController+Empty.swift // BeeFun // // Created by WengHengcong on 2018/6/2. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController: BFPlaceHolderViewDelegate { func refreshEmptyView() { removeEmptyView() showEmptyView() } func showEmptyView() { if !needShowEmptyView { return } //次于未登录及网络错误视图,故需要先判断是否有 if hasReloadView() || hasLoginView() { return } //无未登录及网络错误视图 tableView.isHidden = true if !hasEmptyView() { placeEmptyView = BFPlaceHolderView(frame: self.view.frame, tip: emptyTip, image: emptyImage, actionTitle: emptyActionTitle) placeEmptyView?.placeHolderActionDelegate = self placeEmptyView?.layer.zPosition = .greatestFiniteMagnitude view.insertSubview(placeEmptyView!, at: 0) } if let reloadView = placeEmptyView { view.bringSubviewToFront(reloadView) } } func removeEmptyView() { if !needShowEmptyView { return } placeEmptyView?.removeFromSuperview() tableView.isHidden = false } func hasEmptyView() -> Bool { if placeEmptyView == nil { return false } return true } @objc func request() { } /// 占位图代理 @objc func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Login.swift ================================================ // // BFBaseViewController+Login.swift // BeeFun // // Created by WengHengcong on 2018/6/2. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController { /// 在未登录时,展示了网络出错视图,但是此时需要提醒用户未登录 func noEmptyViewNeedLoginAlert() { if !hasEmptyView() { if !UserManager.shared.needLoginAlert() { return } } } /// 更改属性,重新刷新视图 func refreshLoginView() { removeLoginView() showLoginView() } func showLoginView() { if !needShowLoginView { return } //次于网络出错视图,若有网络出错视图,则不添加,直接移除未登录视图 if hasReloadView() { removeLoginView() removeEmptyView() return } DispatchQueue.main.async { if let loginClosure = self.loginViewClosure { //未登录 loginClosure(false) } } //无网络出错视图 removeEmptyView() tableView.isHidden = true if !hasLoginView() { placeLoginView = BFPlaceHolderView(frame: view.frame, tip: loginTip, image: loginImage, actionTitle: loginActionTitle) // .greatestFiniteMagnitude 可以使view始终在最上层 placeLoginView?.layer.zPosition = .greatestFiniteMagnitude placeLoginView?.placeHolderActionDelegate = self view.insertSubview(placeLoginView!, at: 0) } if let reloadView = placeLoginView { view.bringSubviewToFront(reloadView) } } func removeLoginView() { if !needShowLoginView { return } DispatchQueue.main.async { if let loginClosure = self.loginViewClosure { //已登录 loginClosure(true) } } placeLoginView?.removeFromSuperview() tableView.isHidden = false } func hasLoginView() -> Bool { if placeLoginView == nil { return false } return true } @objc func login() { UserManager.shared.userSignIn() } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Nav.swift ================================================ // // BFBaseViewController+Nav.swift // BeeFun // // Created by WengHengcong on 2017/4/16. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController { func customView() { self.view.backgroundColor = UIColor.bfViewBackgroundColor //下面语句添加在CPBaseNavigationController中无效 self.navigationController?.navigationBar.barTintColor = UIColor.bfRedColor self.navigationController?.navigationBar.titleTextAttributes = BFStyleGuide.navTitleTextAttributes() //返回按钮颜色与文字 self.navigationController?.navigationBar.tintColor = UIColor.white //启用滑动返回(swipe back) self.navigationController?.interactivePopGestureRecognizer!.delegate = self customLeftItem() customRightItem() } func customLeftItem() { leftItem = UIButton() leftItem!.setImage(UIImage(named: "arrow_left"), for: UIControl.State()) leftItem!.setImage(UIImage(named: "arrow_left"), for: .selected) leftItem?.titleLabel?.font = UIFont.bfSystemFont(ofSize: 17.0) leftItem?.setTitleColor(.white, for: .normal) leftItem?.setTitleColor(UIColor.bfLineBackgroundColor, for: .disabled) leftItem!.addTarget(self, action: #selector(BFBaseViewController.navigationShouldPopOnBackButton), for: .touchUpInside) leftItem!.isHidden = false layoutLeftItem() } func layoutLeftItem() { if leftItem?.currentImage != nil { leftItem!.frame = CGRect(x: 0, y: 5, width: 25, height: 25) } else { leftItem!.frame = CGRect(x: 0, y: 5, width: 40, height: 25) } let leftBarButton = UIBarButtonItem(customView: leftItem!) let leftSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) leftSpace.width = -8; //越小越靠左 self.navigationItem.leftBarButtonItems = [leftSpace, leftBarButton] } func customRightItem() { rightItem = UIButton() rightItem?.titleLabel?.font = UIFont.bfSystemFont(ofSize: 17.0) rightItem?.titleLabel?.adjustsFontSizeToFitWidth = true rightItem?.titleLabel?.minimumScaleFactor = 0.7 rightItem?.setTitleColor(.white, for: .normal) rightItem?.setTitleColor(UIColor.bfLineBackgroundColor, for: .disabled) rightItem!.addTarget(self, action: #selector(BFBaseViewController.rightItemAction(_:)), for: .touchUpInside) rightItem!.isHidden = true layoutRightItem() } func layoutRightItem() { if rightItem?.currentImage != nil { rightItem!.frame = CGRect(x: 0, y: 5, width: 25, height: 25) } else { rightItem!.frame = CGRect(x: 0, y: 5, width: 40, height: 25) } if #available(iOS 11, *) { let view = UIView(frame: CGRect(x: 0, y: 5, w: 0, h: 25)) view.backgroundColor = .blue if rightItem?.currentImage != nil { rightItem!.frame = CGRect(x: 0, y: 0, width: 25, height: 25) } else { rightItem!.frame = CGRect(x: 0, y: 0, width: 40, height: 25) } view.addSubview(rightItem!) let rightBarButton = UIBarButtonItem(customView: view) self.navigationItem.rightBarButtonItem = rightBarButton } else { //.... Set Right/Left Bar Button item let rightBarButton = UIBarButtonItem(customView: rightItem!) let rightSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) rightSpace.width = -8; //越小越靠右 self.navigationItem.rightBarButtonItems = [rightSpace, rightBarButton] } } func setLeftBarItem(_ left: UIButton) { //.... Set Right/Left Bar Button item let leftBarButton = UIBarButtonItem(customView: left) let leftSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) leftSpace.width = -8; //越小越靠左 self.navigationItem.leftBarButtonItems = [leftSpace, leftBarButton] } func setRightBarItem(_ right: UIButton) { let rightBarButton = UIBarButtonItem(customView: right) let rightSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) rightSpace.width = -8; //越小越靠右 self.navigationItem.rightBarButtonItems = [rightSpace, rightBarButton] } } extension BFBaseViewController: NavigationControllerBackButtonDelegate { @objc func navigationShouldPopOnBackButton() -> Bool { leftItemAction(leftItem!) return false } /// 导航栏左边按钮点击 /// /// - Parameter sender: <#sender description#> @objc func leftItemAction(_ sender: UIButton?) { } /// 导航栏右边按钮点击 /// /// - Parameter sender: <#sender description#> @objc func rightItemAction(_ sender: UIButton?) { } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Noti.swift ================================================ // // BFBaseViewController+Noti.swift // BeeFun // // Created by WengHengcong on 2018/6/2. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController { func registerNoti() { NotificationCenter.default.addObserver(self, selector: #selector(loginSuccessful), name: NSNotification.Name.BeeFun.DidLogin, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(logoutSuccessful), name: NSNotification.Name.BeeFun.DidLogout, object: nil) //Network reachablity NotificationCenter.default.addObserver(self, selector: #selector(networkCantReachable), name: NSNotification.Name.BeeFun.UnReachableAfterReachable, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(networkReachable), name: NSNotification.Name.BeeFun.ReachableAfterUnreachable, object: nil) } @objc func loginSuccessful() { removeLoginView() } @objc func logoutSuccessful() { } @objc func networkCantReachable() { //显示reloadview showReloadView() } @objc func networkReachable() { removeReloadView() //进行重连 reconnect() } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Refresh.swift ================================================ // // BFBaseViewController+Refresh.swift // BeeFun // // Created by WengHengcong on 2017/4/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import MJRefresh enum RefreshHidderType { case none case all case header case footer } extension BFBaseViewController : MJRefreshManagerAction { @objc func headerRefresh() { tableView.mj_header.endRefreshing() // DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { // } } @objc func footerRefresh() { tableView.mj_footer.endRefreshing() // DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) { // } } func endHeaderRefreshing() { tableView.mj_header.endRefreshing() } func endFooterRefreshing() { tableView.mj_footer.endRefreshing() } func endRefreshing() { endHeaderRefreshing() endFooterRefreshing() } func setRefreshHiddenOrShow() { switch refreshHidden { case .none: self.tableView.mj_footer.isHidden = false self.tableView.mj_header.isHidden = false case .all: self.tableView.mj_footer.isHidden = true self.tableView.mj_header.isHidden = true case .header: self.tableView.mj_footer.isHidden = true self.tableView.mj_header.isHidden = false case .footer: self.tableView.mj_footer.isHidden = false self.tableView.mj_header.isHidden = true } } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+Reload.swift ================================================ // // BFBaseViewController+Reload.swift // BeeFun // // Created by WengHengcong on 2018/5/31. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController { /// 检查当前网络状态,并显示网络异常页面 func checkCurrentNetworkState() -> Bool { if BFNetworkManager.shared.isReachable { removeReloadView() } else { showReloadView() } return BFNetworkManager.shared.isReachable } /// 检查是否登录,会显示未登录视图 func checkCurrentLoginState() -> Bool { if UserManager.shared.isLogin { removeLoginView() } else { showLoginView() } return UserManager.shared.isLogin } func refreshReloadView() { removeReloadView() showReloadView() } func showReloadView() { if !needShowReloadView { return } //最高等级占位图,可移除登录、无数据视图及隐藏表格 DispatchQueue.main.async { if let reloadClosure = self.reloadViewClosure { //不能触达网络 reloadClosure(false) } } tableView.isHidden = true removeLoginView() removeEmptyView() tableView.isHidden = true if !hasReloadView() { placeReloadView = BFPlaceHolderView(frame: view.frame, tip: reloadTip, image: reloadImage, actionTitle: reloadActionTitle) placeReloadView?.layer.zPosition = .greatestFiniteMagnitude placeReloadView?.placeHolderActionDelegate = self view.insertSubview(placeReloadView!, at: 0) } if let reloadView = placeReloadView { view.bringSubviewToFront(reloadView) } } func removeReloadView() { if !needShowReloadView { return } DispatchQueue.main.async { if let reloadClosure = self.reloadViewClosure { //触达网络 reloadClosure(true) } } placeReloadView?.removeFromSuperview() tableView.isHidden = false } func hasReloadView() -> Bool { if placeReloadView == nil { return false } return true } @objc func reconnect() { if !hasEmptyView() && needLogin { _ = UserManager.shared.needLoginAlert() } } } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController+TableView.swift ================================================ // // BFBaseViewController+TableView.swift // BeeFun // // Created by WengHengcong on 2017/4/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit extension BFBaseViewController: UITableViewDataSource { func getBaseTableView() -> UITableView { let table = UITableView() table.frame = CGRect.zero table.dataSource = self table.delegate = self table.separatorStyle = .none table.backgroundColor = UIColor.bfViewBackgroundColor header = refreshManager.header() footer = refreshManager.footer() table.mj_header = header table.mj_footer = footer refreshManager.delegate = self if #available(iOS 11, *) { table.estimatedRowHeight = 0 table.estimatedSectionHeaderHeight = 0 table.estimatedSectionFooterHeight = 0 } return table } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return UITableViewCell() } } extension BFBaseViewController: UITableViewDelegate { } ================================================ FILE: BeeFun/BeeFun/View/BaseViewController/BFBaseViewController.swift ================================================ // // BFBaseViewController.swift // BeeFun // // Created by wenghengcong on 15/12/30. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit import MJRefresh protocol BFViewControllerNetworkProtocol: class { func networkSuccssful() func networkFailure() } class BFBaseViewController: UIViewController, UIGestureRecognizerDelegate { typealias PlaceHolderAction = ((Bool) -> Void) // MARK: - 视图 var topOffset: CGFloat = uiTopBarHeight /// 是否需要登录态 var needLogin = true // MARK: - 各种占位图:网络 > 未登录 > 无数据 //Reload View var needShowReloadView = true var placeReloadView: BFPlaceHolderView? var reloadTip = "Wake up your connection!".localized { didSet { } } var reloadImage = "network_error_1" { didSet { } } var reloadActionTitle = "Try Again".localized { didSet { } } var reloadViewClosure: PlaceHolderAction? //Empty View var needShowEmptyView = true var placeEmptyView: BFPlaceHolderView? var emptyTip = "Empty now".localized { didSet { } } var emptyImage = "empty_data" { didSet { } } var emptyActionTitle = "Go".localized { didSet { } } var emptyViewClosure: PlaceHolderAction? //Login View var needShowLoginView = true var placeLoginView: BFPlaceHolderView? var loginTip = "Please login first".localized { didSet { } } var loginImage = "github_signin_logo" { didSet { } } var loginActionTitle = "Sign in".localized { didSet { } } var loginViewClosure: PlaceHolderAction? // MARK: - 刷新控件 var refreshHidden: RefreshHidderType = .all { didSet { setRefreshHiddenOrShow() } } var refreshManager = MJRefreshManager() var header: MJRefreshNormalHeader! var footer: MJRefreshAutoNormalFooter! lazy var tableView: UITableView = { return self.getBaseTableView() }() // MARK: - 导航栏左右按钮 var leftItem: UIButton? { didSet { if let left = leftItem { setLeftBarItem(left) } } } var rightItem: UIButton? { didSet { if let right = rightItem { setRightBarItem(right) } } } var leftItemImage: UIImage? { didSet { leftItem!.setImage(leftItemImage, for: .normal) layoutLeftItem() } } var leftItemSelImage: UIImage? { didSet { leftItem!.setImage(leftItemSelImage, for: .selected) layoutLeftItem() } } var rightItemImage: UIImage? { didSet { rightItem!.setImage(rightItemImage, for: .normal) layoutRightItem() } } var rightItemSelImage: UIImage? { didSet { rightItem!.setImage(rightItemSelImage, for: .selected) layoutRightItem() } } // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() customView() gatherUserActivityInViewDidload() registerNoti() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) gatherUserActivityInViewWillAppear() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) gatherUserActivityInViewWillDisAppear() } } ================================================ FILE: BeeFun/BeeFun/View/Common/BFEmptyDataCell.swift ================================================ // // BFEmptyDataCell.swift // BeeFun // // Created by WengHengcong on 2018/6/2. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit protocol BFEmptyDataCellDelegate: class { func didClickEmptyAction(cell: BFEmptyDataCell) } class BFEmptyDataCell: UITableViewCell, BFPlaceHolderViewDelegate { // 无数据提醒 var tip: String? // 无数据提醒的图片 var tipImage: String? // 无数据按钮的title var actionTitle: String? var placeEmptyView: BFPlaceHolderView? weak var delegate: BFEmptyDataCellDelegate? private let emptyViewTag: Int = 12353 override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func display(tip: String?, imageName: String?, actionTitle: String?) { self.tip = tip self.tipImage = imageName self.actionTitle = actionTitle if self.tip == nil { self.tip = "Empty now" } if self.tipImage == nil { self.tipImage = "empty_data" } if self.actionTitle == nil { self.actionTitle = "Explore more".localized } setNeedsDisplay() } override func layoutSubviews() { removeEmptyView() placeEmptyView = BFPlaceHolderView(frame: self.contentView.frame, tip: tip!, image: tipImage!, actionTitle: actionTitle!) placeEmptyView?.placeHolderActionDelegate = self contentView.addSubview(placeEmptyView!) } func removeEmptyView() { if let emptyView = placeEmptyView { emptyView.removeFromSuperview() } } func didAction(place: BFPlaceHolderView) { delegate?.didClickEmptyAction(cell: self) } } ================================================ FILE: BeeFun/BeeFun/View/Common/BFPlaceHolderView.swift ================================================ // // BFPlaceHolderView.swift // BeeFun // // Created by WengHengcong on 2018/6/2. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit protocol BFPlaceHolderViewDelegate: class { func didAction(place: BFPlaceHolderView) } /// 占位视图 class BFPlaceHolderView: UIView { /// 提示字符串 var tip: String? /// 提示图 var image: String? /// 操作按钮标题 var actionTitle: String? /// 要执行的动作 weak var placeHolderActionDelegate: BFPlaceHolderViewDelegate? private var tipLabel = UILabel() private var tipImageView = UIImageView() private var actionButton = UIButton() override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } convenience init() { self.init(frame: CGRect.zero) bfphv_custom() } convenience init(tip: String?, image: String?, actionTitle: String?) { self.init(frame: CGRect.zero, tip: tip, image: image, actionTitle: actionTitle) } convenience init(frame: CGRect, tip: String?, image: String?, actionTitle: String?) { self.init(frame: frame) self.tip = tip self.image = image self.actionTitle = actionTitle // windowLevel = .greatestFiniteMagnitude bfphv_custom() } private func bfphv_custom() { backgroundColor = UIColor.white addSubview(tipImageView) tipLabel.font = UIFont.bfSystemFont(ofSize: 19.0) tipLabel.numberOfLines = 0 tipLabel.textAlignment = .center tipLabel.textColor = UIColor.iOS11Gray addSubview(tipLabel) actionButton.addBorderAround(UIColor.bfRedColor, radius: 2.0, width: 1.0) actionButton.setTitleColor(UIColor.bfRedColor, for: .normal) actionButton.setTitleColor(UIColor.bfRedColor, for: .highlighted) actionButton.titleLabel?.textAlignment = .center actionButton.titleLabel?.font = UIFont.bfSystemFont(ofSize: 18.0) actionButton.addTarget(self, action: #selector(buttonAction), for: UIControl.Event.touchUpInside) addSubview(actionButton) fillDataToUI() } @objc func buttonAction() { print("reload action tapped") DispatchQueue.main.async { self.placeHolderActionDelegate?.didAction(place: self) } } // MARK: - 数据 /// 刷新数据到页面 func fillDataToUI() { if let imageName = image, let uiimageObj = UIImage(named: imageName) { tipImageView.image = uiimageObj } if let tipString = tip { tipLabel.text = tipString } if let buttonTitle = actionTitle { actionButton.setTitle(buttonTitle, for: .normal) } setNeedsDisplay() } /// 重新布局 override func layoutSubviews() { assert(tipImageView.image != nil) let uiimageObj = tipImageView.image! let imageW: CGFloat = uiimageObj.size.width let imageX: CGFloat = (self.width-imageW)/2 let imageH: CGFloat = uiimageObj.size.height tipImageView.frame = CGRect(x: imageX, y: 100, w: imageW, h: imageH) let imageToLabelMargin: CGFloat = 13 let tipLabelX: CGFloat = 40 let tipLabelW = self.width-2*tipLabelX let tipLabelH = BFGlobalHelper.heightWithConstrainedWidth(tipLabel.text ?? "", width: tipLabelW, font: tipLabel.font) let labelToButtonMargin: CGFloat = 15 let btnH: CGFloat = 40 let btnW: CGFloat = BFGlobalHelper.widthWithConstrainedHeight(actionButton.currentTitle ?? "", height: btnH, font: actionButton.titleLabel!.font) + 20 let btnX = (self.width-btnW)/2 let allH = imageH + imageToLabelMargin + tipLabelH + labelToButtonMargin + btnH let allY = (self.height-allH)/2-20 tipImageView.frame = CGRect(x: imageX, y: allY, w: imageW, h: imageH) let tipLabelY = tipImageView.bottom + imageToLabelMargin tipLabel.frame = CGRect(x: tipLabelX, y: tipLabelY, w: tipLabelW, h: tipLabelH) let btnY: CGFloat = tipLabel.bottom + labelToButtonMargin actionButton.frame = CGRect(x: btnX, y: btnY, w: btnW, h: btnH) } // MARK: - 重绘页面 func refresh() { setNeedsDisplay() } func refresh(tip: String?) { refresh(tip: tip, image: nil, actionTitle: nil) } func refresh(image: String?) { refresh(tip: nil, image: image, actionTitle: nil) } func refresh(actionTitle: String?) { refresh(tip: nil, image: nil, actionTitle: actionTitle) } func refresh(tip: String?, image: String?, actionTitle: String?) { if tip != nil { self.tip = tip } if image != nil { self.image = image } if actionTitle != nil { self.actionTitle = actionTitle } fillDataToUI() } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_CommitCommentEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_comment-discussion_50_0_000000_none copy.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_CreateEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_tag_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_DeleteEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_git-branch_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_ForkEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_git-branch_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_GollumEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "octicons_4-3-0_pencil_50_0_000000_none.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_IssueCommentEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_comment-discussion_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_IssuesEvent_closed.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_issue-closed_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_IssuesEvent_opened.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_issue-opened_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_MemberEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_person_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_PullRequestEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_git-pull-request_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_PullRequestReviewCommentEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_comment-discussion_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_PushEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_git-commit_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_ReleaseEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_tag_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_WatchEvent.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_star_50_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/event_commit_icon.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "octicons_4-3-0_git-commit_20_0_000000_none.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/Event.xcassets/git-pull-request_256.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "git-pull-request_256.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Event/EventCell/BFEventBaseCell.swift ================================================ // // BFEventBaseCell.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFEventBaseCell: UITableViewCell { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) // for view in self.subviews where view.isKind(of: UIScrollView.self) { // let scroll = view as? UIScrollView // scroll?.canCancelContentTouches = true // scroll?.delaysContentTouches = false // break // } selectionStyle = .none backgroundView?.backgroundColor = .clear contentView.backgroundColor = .clear backgroundColor = .clear } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } ================================================ FILE: BeeFun/BeeFun/View/Event/EventCell/BFEventCell.swift ================================================ // // BFEventCell.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText class BFEventCell: BFEventBaseCell { var eventView: BFEventView? var layout: BFEventLayout? var actionImageView = UIImageView() var timeLabel: YYLabel = YYLabel() var titleLabel: YYLabel = YYLabel() var actorButton = UIButton() /// event 执行者头像 var commitLabel: YYLabel = YYLabel() var prDetailLabel: YYLabel = YYLabel() var contentLabel: YYLabel = YYLabel() var topLine: UIView = UIView() var bottomLine: UIView = UIView() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupInitCell() setupActionImageView() setupTimeLabel() setupTitleLabel() setupActorImageView() setupCommitLabel() setupDetailLabel() setupContentLabel() setupLines() } func setupInitCell() { var newFrame = frame newFrame.size.width = ScreenSize.width newFrame.size.height = 1 self.frame = newFrame contentView.isUserInteractionEnabled = true isUserInteractionEnabled = true } func setupActionImageView() { actionImageView.frame = CGRect(x: BFEventConstants.ACTION_IMG_LEFT, y: BFEventConstants.ACTION_IMG_TOP, w: BFEventConstants.ACTION_IMG_WIDTH, h: BFEventConstants.ACTION_IMG_WIDTH) // actionImageView.isHidden = true actionImageView.image = UIImage(named: "git-comment-discussion_50") actionImageView.isUserInteractionEnabled = true contentView.addSubview(actionImageView) } func setupTimeLabel() { timeLabel.size = CGSize(width: self.width, height: self.height) timeLabel.ignoreCommonProperties = true timeLabel.displaysAsynchronously = true timeLabel.fadeOnAsynchronouslyDisplay = false timeLabel.fadeOnHighlight = false contentView.addSubview(timeLabel) } func setupTitleLabel() { titleLabel.size = CGSize(width: self.width, height: self.height) titleLabel.displaysAsynchronously = true titleLabel.ignoreCommonProperties = true titleLabel.fadeOnAsynchronouslyDisplay = false titleLabel.fadeOnHighlight = false titleLabel.numberOfLines = 0 contentView.addSubview(titleLabel) } func setupActorImageView() { //actor image view actorButton.frame = CGRect(x: 0, y: 0, w: BFEventConstants.ACTOR_IMG_WIDTH, h: BFEventConstants.ACTOR_IMG_WIDTH) contentView.addSubview(actorButton) } func setupCommitLabel() { commitLabel.size = CGSize(width: self.width, height: self.height) // commitLabel.backgroundColor = UIColor.hex("#eaf5ff") commitLabel.numberOfLines = 1 commitLabel.displaysAsynchronously = true commitLabel.ignoreCommonProperties = true commitLabel.fadeOnAsynchronouslyDisplay = false commitLabel.fadeOnHighlight = false contentView.addSubview(commitLabel) } func setupDetailLabel() { prDetailLabel.size = CGSize(width: self.width, height: self.height) prDetailLabel.backgroundColor = UIColor.hex("#eaf5ff") prDetailLabel.numberOfLines = 1 prDetailLabel.displaysAsynchronously = true prDetailLabel.ignoreCommonProperties = true prDetailLabel.fadeOnAsynchronouslyDisplay = false prDetailLabel.fadeOnHighlight = false contentView.addSubview(prDetailLabel) } func setupContentLabel() { contentLabel.size = CGSize(width: self.width, height: self.height) contentLabel.displaysAsynchronously = true contentLabel.ignoreCommonProperties = true contentLabel.fadeOnAsynchronouslyDisplay = false contentLabel.fadeOnHighlight = false contentLabel.numberOfLines = 3 contentView.addSubview(contentLabel) } func setupLines() { //line let retinaPixelSize = 1.0 / (UIScreen.main.scale) topLine.backgroundColor = UIColor.bfLineBackgroundColor topLine.frame = CGRect(x: 0, y: 0, w: self.width, h: retinaPixelSize) contentView.addSubview(topLine) bottomLine.backgroundColor = UIColor.bfLineBackgroundColor bottomLine.size = CGSize(width: self.width, height: retinaPixelSize) contentView.addSubview(bottomLine) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout self.height = layout.totalHeight //contnet view的位置 contentView.top = layout.marginTop contentView.height = layout.totalHeight - layout.marginTop - layout.marginBottom contentView.left = layout.marginLeft contentView.right = ScreenSize.width - layout.marginLeft //action image if let actionImageName = layout.eventTypeActionImage { actionImageView.image = UIImage(named: actionImageName) } //time timeLabel.origin = CGPoint(x: BFEventConstants.TIME_X, y: BFEventConstants.TIME_Y) // timeView?.backgroundColor = UIColor.red if layout.timeHeight > 0 { timeLabel.isHidden = false timeLabel.height = layout.timeHeight timeLabel.textLayout = layout.timeLayout } else { timeLabel.isHidden = true } //title titleLabel.origin = CGPoint(x: timeLabel.left, y: timeLabel.bottom) // titleView?.backgroundColor = UIColor.green if layout.titleHeight > 0 { titleLabel.isHidden = false titleLabel.height = layout.titleHeight titleLabel.textLayout = layout.titleLayout } else { titleLabel.isHidden = true } //-------------->>>>>> action content 内容区域 <<<<<<<------------- //左边的起始距离,就是time的左边距 let actionContentLeft = titleLabel.left let actionContentTop = titleLabel.bottom //actor image if let avatarUrl = layout.event?.actor?.avatar_url, let url = URL(string: avatarUrl) { actorButton.isHidden = false actorButton.origin = CGPoint(x: actionContentLeft + BFEventConstants.ACTOR_IMG_LEFT, y: actionContentTop + BFEventConstants.ACTOR_IMG_TOP) actorButton.kf.setImage(with: url, for: .normal) actorButton.kf.setImage(with: url, for: .highlighted) actorButton.addTarget(self, action: #selector(clickActor), for: .touchUpInside) } else { actorButton.isHidden = true } if let type = layout.event?.type { if type == .watchEvent { actorButton.isHidden = true } } if layout.prDetailHeight > 0 { //pull request 中,同样有text contentLabel.origin = CGPoint(x: actionContentLeft + BFEventConstants.TEXT_X, y: actionContentTop + BFEventConstants.TEXT_Y) // textView?.backgroundColor = .red if layout.textHeight > 0 { contentLabel.isHidden = false contentLabel.height = layout.textHeight contentLabel.textLayout = layout.textLayout } else { contentLabel.isHidden = true } commitLabel.isHidden = true prDetailLabel.isHidden = false prDetailLabel.origin = CGPoint(x: contentLabel.left, y: contentLabel.bottom) prDetailLabel.height = layout.prDetailHeight prDetailLabel.textLayout = layout.prDetailLayout } else if layout.commitHeight > 0 { prDetailLabel.isHidden = true contentLabel.isHidden = true commitLabel.isHidden = false commitLabel.origin = CGPoint(x: actionContentLeft + BFEventConstants.COMMIT_X, y: actionContentTop + BFEventConstants.COMMIT_Y) commitLabel.height = layout.commitHeight commitLabel.textLayout = layout.commitLayout } else { prDetailLabel.isHidden = true commitLabel.isHidden = true //text contentLabel.origin = CGPoint(x: actionContentLeft + BFEventConstants.TEXT_X, y: actionContentTop + BFEventConstants.TEXT_Y) if layout.textHeight > 0 { contentLabel.isHidden = false contentLabel.height = layout.textHeight contentLabel.textLayout = layout.textLayout } else { contentLabel.isHidden = true } } let retinaPixelSize = 1.0 / (UIScreen.main.scale) topLine.origin = CGPoint(x: 0, y: 0) bottomLine.origin = CGPoint(x: 0, y: layout.totalHeight-retinaPixelSize) switch layout.style { case .pullRequest: break case .pushCommit: break case .textPicture: break case .text: actorButton.isHidden = true commitLabel.isHidden = true prDetailLabel.isHidden = true contentLabel.isHidden = true } } @objc func clickActor() { JumpManager.shared.jumpUserDetailView(user: self.layout?.event?.actor) } } ================================================ FILE: BeeFun/BeeFun/View/Event/EventCell/BFEventConstants.swift ================================================ // // BFEventConstants.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// 以下使用top\left\right\bottom即为该控件的margin /// 使用x\y\w\h即该空间的大小位置 class BFEventConstants { //action image static let ACTION_IMG_TOP: CGFloat = 8 static let ACTION_IMG_LEFT: CGFloat = 8 static let ACTION_IMG_RIGHT: CGFloat = 5 static let ACTION_IMG_BOTTOM: CGFloat = 5 static let ACTION_IMG_WIDTH: CGFloat = 25 //Time static let TIME_X = BFEventConstants.ACTION_IMG_LEFT + BFEventConstants.ACTION_IMG_WIDTH + BFEventConstants.ACTION_IMG_RIGHT static let TIME_Y: CGFloat = 2 static let TIME_W: CGFloat = ScreenSize.width - TIME_X static let TIME_FONT_SIZE: CGFloat = 13.0 //title static let TITLE_X: CGFloat = TIME_X static let TITLE_W: CGFloat = TIME_W static let TITLE_FONT_SIZE: CGFloat = 14.0 //----->>>>>> 下面是针对action contentView ,而不是针对整个cell <<<<<<------ //注意在设置时,对齐time的左边距与上边距 static let ACTION_CONTENT_WIDTH = TIME_W //actor iamge static let ACTOR_IMG_TOP: CGFloat = 3 static let ACTOR_IMG_LEFT: CGFloat = 0 static let ACTOR_IMG_RIGHT: CGFloat = 5 static let ACTOR_IMG_BOTTOM: CGFloat = 5 static let ACTOR_IMG_WIDTH: CGFloat = 20 //text static let TEXT_X: CGFloat = ACTOR_IMG_LEFT + ACTOR_IMG_WIDTH + ACTOR_IMG_RIGHT static let TEXT_Y: CGFloat = 3 static let TEXT_W: CGFloat = ACTION_CONTENT_WIDTH - TEXT_X static let TEXT_FONT_SIZE: CGFloat = 14.0 //pull request detil static let PRDETAIL_X: CGFloat = TEXT_X static let PRDETAIL_Y: CGFloat = TEXT_Y static let PRDETAIL_W: CGFloat = TEXT_W static let PRDETAIL_FONT_SIZE: CGFloat = 14.0 //commit static let COMMIT_X: CGFloat = TEXT_X static let COMMIT_Y: CGFloat = TEXT_Y static let COMMIT_W: CGFloat = TEXT_W static let COMMIT_FONT_SIZE: CGFloat = 14.0 } ================================================ FILE: BeeFun/BeeFun/View/Event/EventCell/BFEventLayout.swift ================================================ // // BFEventLayout.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText // 异步绘制导致的闪烁解决方案:https://github.com/ibireme/YYKit/issues/64 // https://github.com/ibireme/YYText/issues/103 /// 布局样式 /// /// - pullRequest: pull request /// - pushCommit: push commit /// - textPicture: 图文布局 /// - text: 文本布局 public enum EventLayoutStyle: Int { case pullRequest case pushCommit case textPicture case text } class BFEventLayout: NSObject { //数据 var event: ObjEvent? var style: EventLayoutStyle = .textPicture //布局 var eventTypeActionImage: String? { return BFEventParase.actionImage(event: event) } //上下左右留白 var marginTop: CGFloat = 0 var marginBottom: CGFloat = 0 var marginLeft: CGFloat = 0 var marginRight: CGFloat = 0 //action 图片 var actionHeight: CGFloat = 0 var actionSize: CGSize = CGSize.zero //时间 var timeHeight: CGFloat = 0 var timeLayout: YYTextLayout? //title var titleHeight: CGFloat = 0 var titleLayout: YYTextLayout? //---->>>> 内容区域 <<<<------- var actionContentHeight: CGFloat = 0 //actor 图片 var actorHeight: CGFloat = 0 var actorSize: CGSize = CGSize.zero //文字content内容 var textHeight: CGFloat = 0 var textLayout: YYTextLayout? //commit 内容 var commitHeight: CGFloat = 0 var commitLayout: YYTextLayout? //pull request detail var prDetailWidth: CGFloat = 0 //1 commit with .....文字的宽度 var prDetailHeight: CGFloat = 0 var prDetailLayout: YYTextLayout? var totalHeight: CGFloat = 0 init(event: ObjEvent?) { super.init() if event == nil { return } self.event = event layout() } /// 布局 func layout() { marginTop = 0 actionHeight = 0 timeHeight = 0 titleHeight = 0 actorHeight = 0 actionContentHeight = 0 textHeight = 0 commitHeight = 0 prDetailHeight = 0 marginBottom = 5 _layoutActionImage() _layoutTime() _layoutTitle() _layoutActorImage() _layoutTextContent() _layoutCommit() _layoutPRDetail() //计算高度 let timeMargin = BFEventConstants.TIME_Y let actorImgMargin = BFEventConstants.ACTOR_IMG_TOP let textMargin = BFEventConstants.TEXT_Y totalHeight = timeMargin+timeHeight+titleHeight+marginBottom style = BFEventParase.layoutType(event: event) switch style { case .pullRequest: totalHeight += textMargin + max(actorImgMargin+actorHeight, textHeight+prDetailHeight) case .pushCommit: totalHeight += textMargin + max(actorImgMargin+actorHeight, commitHeight) case .textPicture: totalHeight += textMargin + max(actorImgMargin+actorHeight, textHeight) case .text: break } actionContentHeight = totalHeight-timeMargin-timeHeight-titleHeight } private func _layoutActionImage() { actionHeight = BFEventConstants.ACTOR_IMG_WIDTH } private func _layoutTime() { timeHeight = 0 timeLayout = nil if let time = event?.created_at { if let showTime = BFTimeHelper.shared.readableTime(rare: time, prefix: nil) { let timeAtt = NSMutableAttributedString(string: showTime) let container = YYTextContainer(size: CGSize(width: BFEventConstants.TIME_W, height: CGFloat.greatestFiniteMagnitude)) timeAtt.yy_font = UIFont.bfSystemFont(ofSize: BFEventConstants.TIME_FONT_SIZE) let layout = YYTextLayout(container: container, text: timeAtt) timeLayout = layout timeHeight = timeLayout!.textBoundingSize.height } } } private func _layoutTitle() { titleHeight = 0 titleLayout = nil let titleText: NSMutableAttributedString = NSMutableAttributedString() //用户名 if let actorName = BFEventParase.actorName(event: event) { let actorAttriText = NSMutableAttributedString(string: actorName) actorAttriText.yy_setTextHighlight(actorAttriText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpUserDetailView(user: self.event?.actor) }, longPressAction: nil) titleText.append(actorAttriText) } let actionText = NSMutableAttributedString(string: BFEventParase.action(event: event)) titleText.append(actionText) //介于actor与repo中间的部分 if let type = event?.type { if type == .pushEvent { //[aure] pushed to [develop] at [AudioKit/AudioKit] if let ref = event?.payload?.ref { if let reponame = event?.repo?.name, let branch = ref.components(separatedBy: "/").last { //https://github.com/AudioKit/AudioKit/tree/develop let url = "https://github.com/"+reponame+"/tree/"+branch let branchText = NSMutableAttributedString(string: branch) branchText.yy_setTextHighlight(branchText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpWebView(url: url) }, longPressAction: nil) titleText.append(branchText) } } } else if type == .releaseEvent { //[ckrey] released [Session Manager and CoreDataPersistence] at [ckrey/MQTT-Client-Framework] if let releaseName = event?.payload?.release?.name, let releaseUrl = event?.payload?.release?.html_url { let releaseText = NSMutableAttributedString(string: releaseName) releaseText.yy_setTextHighlight(releaseText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpWebView(url: releaseUrl) }, longPressAction: nil) titleText.append(releaseText) titleText.append(NSMutableAttributedString(string: " at ")) } } else if type == .createEvent { //[ckrey] created [tag] [0.9.9] at [ckrey/MQTT-Client-Framework] if let tag = event?.payload?.ref { let tagText = NSMutableAttributedString(string: tag) tagText.yy_setTextHighlight(tagText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in //https://github.com/user/repo/tree/tag if let repoName = self.event?.repo?.name { let url = "https://github.com/"+repoName+"/tree/"+tag JumpManager.shared.jumpWebView(url: url) } }, longPressAction: nil) titleText.append(tagText) titleText.append(NSMutableAttributedString(string: " at ")) } } else if type == .forkEvent { //[cloudwu] forked [bkaradzic/bx] to [cloudwu/bx] if let repo = BFEventParase.repoName(event: event) { let repoAttrText = NSMutableAttributedString(string: repo) repoAttrText.yy_setTextHighlight(repoAttrText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpReposDetailView(repos: self.event?.repo, from: .other) }, longPressAction: nil) titleText.append(repoAttrText) titleText.append(NSMutableAttributedString(string: " to ")) } } else if type == .deleteEvent { if let branch = event?.payload?.ref { let branchText = NSMutableAttributedString(string: branch) branchText.yy_setTextHighlight(branchText.yy_rangeOfAll(), color: UIColor.bfLabelSubtitleTextColor, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in }, longPressAction: nil) titleText.append(branchText) titleText.append(NSMutableAttributedString(string: " at ")) } } else if type == .memberEvent { if let memberName = event?.payload?.member?.login { let memberText = NSMutableAttributedString(string: memberName) memberText.yy_setTextHighlight(memberText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpReposDetailView(repos: self.event?.repo, from: .other) }, longPressAction: nil) titleText.append(memberText) titleText.append(NSMutableAttributedString(string: " to ")) } } } //repos if let type = event?.type { if type == .forkEvent { if let user = BFEventParase.actorName(event: event), let repoName = event?.payload?.forkee?.name { let repoAttrText = NSMutableAttributedString(string: user+repoName) repoAttrText.yy_setTextHighlight(repoAttrText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpReposDetailView(repos: self.event?.repo, from: .other) }, longPressAction: nil) titleText.append(repoAttrText) } } else { if let repo = BFEventParase.repoName(event: event) { var actionNumberStr = "" if let actionNumber = event?.payload?.issue?.number { actionNumberStr = "#\(actionNumber)" } else if let actionNumber = event?.payload?.pull_request?.number { //https://github.com/user/repo/pull/number actionNumberStr = "#\(actionNumber)" } let repoAttrText = NSMutableAttributedString(string: " " + repo + "\(actionNumberStr)") repoAttrText.yy_setTextHighlight(repoAttrText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in if let eventType = self.event?.type { switch eventType { case .pullRequestEvent: JumpManager.shared.jumpWebView(url: self.event?.payload?.pull_request?.html_url) return default: break } } if let comment = self.event?.payload?.comment { JumpManager.shared.jumpWebView(url: comment.html_url) } else { JumpManager.shared.jumpReposDetailView(repos: self.event?.repo, from: .other) } }, longPressAction: nil) titleText.append(repoAttrText) } } } titleText.yy_font = UIFont.bfSystemFont(ofSize: BFEventConstants.TITLE_FONT_SIZE) let container = YYTextContainer(size: CGSize(width: BFEventConstants.TITLE_W, height: CGFloat.greatestFiniteMagnitude)) let layout = YYTextLayout(container: container, text: titleText) titleHeight = layout!.textBoundingSize.height titleLayout = layout } private func _layoutActorImage() { actorHeight = BFEventConstants.ACTOR_IMG_WIDTH } private func _layoutTextContent() { textHeight = 0 textLayout = nil let textText: NSMutableAttributedString = NSMutableAttributedString() if let type = event?.type { if type == .issueCommentEvent || type == .pullRequestReviewCommentEvent || type == .commitCommentEvent { if let commentBody = BFEventParase.contentBody(event: event) { let clipLength = 130 let commentBodyAttText = NSMutableAttributedString(string: commentBody) if commentBodyAttText.length > clipLength { let moreRange = NSRange(location: clipLength, length: commentBodyAttText.length-clipLength) commentBodyAttText.replaceCharacters(in: moreRange, with: YYTextManager.moreDotCharacterAttribute(count: 3)) } textText.append(commentBodyAttText) } } else if type == .issuesEvent { if let issueBody = BFEventParase.contentBody(event: event) { let clipLength = 130 let commentBodyAttText = NSMutableAttributedString(string: issueBody) if commentBodyAttText.length > clipLength { let moreRange = NSRange(location: clipLength, length: commentBodyAttText.length-clipLength) commentBodyAttText.replaceCharacters(in: moreRange, with: YYTextManager.moreDotCharacterAttribute(count: 3)) } textText.append(commentBodyAttText) } } else if type == .releaseEvent { if let releaseText = BFEventParase.contentBody(event: event) { let releaseAttText = NSMutableAttributedString(string: releaseText) textText.append(releaseAttText) } } else if type == .pullRequestEvent { if let pullRequestText = BFEventParase.contentBody(event: event) { let clipLength = 130 let pullRequestAttText = NSMutableAttributedString(string: pullRequestText) if pullRequestAttText.length > clipLength { let moreRange = NSRange(location: clipLength, length: pullRequestAttText.length-clipLength) pullRequestAttText.replaceCharacters(in: moreRange, with: YYTextManager.moreDotCharacterAttribute(count: 3)) } textText.append(pullRequestAttText) } } else if type == .gollumEvent { if let pages = event?.payload?.pages { let page: ObjPage = pages.first! let act = page.action! let actText = NSMutableAttributedString(string: act) textText.append(actText) textText.addBlankSpaceCharacterAttribute(1) //AFNetworking 3.0 Migration Guide 跳转 if let pageName = page.title { let pageNameText = NSMutableAttributedString(string: pageName) pageNameText.yy_setTextHighlight(pageNameText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpWebView(url: page.html_url) }, longPressAction: nil) textText.append(pageNameText) textText.addBlankSpaceCharacterAttribute(1) } //View the diff if let sha = page.sha { let shaText = NSMutableAttributedString(string: "View the diff>>") if let html_url = page.html_url { let jump_url = html_url + "/_compare/"+sha shaText.yy_setTextHighlight(shaText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in JumpManager.shared.jumpWebView(url: jump_url) }, longPressAction: nil) } textText.append(shaText) } } } textText.yy_font = UIFont.bfSystemFont(ofSize: BFEventConstants.TEXT_FONT_SIZE) let container = YYTextContainer(size: CGSize(width: BFEventConstants.TEXT_W, height: CGFloat.greatestFiniteMagnitude)) let layout = YYTextLayout(container: container, text: textText) textHeight = layout!.textBoundingSize.height textLayout = layout } } private func _layoutCommit() { commitHeight = 0 commitLayout = nil if let eventtype = event?.type { if eventtype != .pushEvent { return } } let pushText: NSMutableAttributedString = NSMutableAttributedString() let font = UIFont.bfSystemFont(ofSize: BFEventConstants.COMMIT_FONT_SIZE) if let commits = event?.payload?.commits { let allCommitText = NSMutableAttributedString() for (index, commit) in commits.reversed().enumerated() where index < 2 { if let hashStr = commit.sha?.substring(to: 6), let message = commit.message { let commitText = NSMutableAttributedString(string: hashStr) commitText.yy_setTextHighlight(commitText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in //跳转到具体commit if let reponame = self.event?.repo?.name, let sha = commit.sha { //https://github.com/user/repo/commit/sha let url = "https://github.com/"+reponame+"/commit/"+sha JumpManager.shared.jumpWebView(url: url) } }, longPressAction: nil) let messageText = NSMutableAttributedString(string: message) commitText.addBlankSpaceCharacterAttribute(2) commitText.append(messageText) commitText.addLineBreakCharacterAttribute() allCommitText.append(commitText) } } pushText.append(allCommitText) if commits.count == 2 { let moreText = NSMutableAttributedString(string: "View comparison for these 2 commits »") moreText.yy_setTextHighlight(moreText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in if let reponame = self.event?.repo?.name, let before = self.event?.payload?.before, let head = self.event?.payload?.head { //https://github.com/user/repo/comare/before_sha...header_sha let url = "https://github.com/"+reponame+"/compare/"+before+"..."+head JumpManager.shared.jumpWebView(url: url) } }, longPressAction: nil) pushText.append(moreText) } else if commits.count > 2 { //commist.count > 2 if let all = event?.payload?.distinct_size { let more = all - 2 var moreStr = "\(more) more cmmmit" if more > 0 { if more > 1 { moreStr.append("s >>") } else if more == 1 { moreStr.append(" >>") } let moreText = NSMutableAttributedString(string: moreStr) moreText.yy_setTextHighlight(moreText.yy_rangeOfAll(), color: UIColor.blue, backgroundColor: UIColor.white, userInfo: nil, tapAction: { (_, _, _, _) in if let reponame = self.event?.repo?.name, let before = self.event?.payload?.before, let head = self.event?.payload?.head { //https://github.com/user/repo/comare/before_sha...header_sha let url = "https://github.com/"+reponame+"/compare/"+before+"..."+head JumpManager.shared.jumpWebView(url: url) } }, longPressAction: nil) pushText.append(moreText) } } } pushText.yy_font = font let container = YYTextContainer(size: CGSize(width: BFEventConstants.COMMIT_W, height: CGFloat.greatestFiniteMagnitude)) let layout = YYTextLayout(container: container, text: pushText) commitHeight = layout!.textBoundingSize.height commitLayout = layout } } private func _layoutPRDetail() { prDetailHeight = 0 prDetailLayout = nil if let eventtype = event?.type { if eventtype != .pullRequestEvent { return } } let prDetailText: NSMutableAttributedString = NSMutableAttributedString() let font = UIFont.bfSystemFont(ofSize: BFEventConstants.PRDETAIL_FONT_SIZE) if let pull_request = event?.payload?.pull_request { if let commits = pull_request.commits, let additions = pull_request.additions, let deletions = pull_request.deletions { //图片 let size = CGSize(width: 10, height: 10) var image = UIImage(named: "event_commit_icon") if image != nil { image = UIImage(cgImage: image!.cgImage!, scale: 2.0, orientation: UIImage.Orientation.up) let imageText = NSMutableAttributedString.yy_attachmentString(withContent: image, contentMode: .center, attachmentSize: size, alignTo: font, alignment: .center) prDetailText.append(imageText) prDetailText.addBlankSpaceCharacterAttribute(1) } //1 commit with 1 addition and 0 deletions let commitStirng = commits <= 1 ? "commit" : "commits" let additionString = additions == 1 ? "addition" : "additions" let deletionString = deletions == 1 ? "deletion" : "deletions" let detailString = "\(pull_request.commits!) " + commitStirng + " with " + "\(pull_request.additions!) " + additionString + " and " + "\(pull_request.deletions!) " + deletionString let textText = NSMutableAttributedString(string: detailString) prDetailText.append(textText) prDetailText.yy_font = font let container = YYTextContainer(size: CGSize(width: BFEventConstants.PRDETAIL_W, height: CGFloat.greatestFiniteMagnitude)) let layout = YYTextLayout(container: container, text: prDetailText) prDetailHeight = layout!.textBoundingSize.height prDetailWidth = layout!.textBoundingRect.width prDetailLayout = layout } } } } ================================================ FILE: BeeFun/BeeFun/View/Event/EventCell/BFEventParase.swift ================================================ // // BFEventParase.swift // BeeFun // // Created by WengHengcong on 29/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFEventParase: NSObject { // MARK: - 获取各种类型中的动作图片 public class func actionImage(event: ObjEvent?) -> String? { var actionImageName: String? = nil if let type = event?.type { actionImageName = String(format: "event_%@", type.rawValue) switch type { case .issuesEvent: if let action = event?.payload?.action { actionImageName = String(format: "event_%@_%@", type.rawValue, action.rawValue) } default: break } } return actionImageName } // MARK: - 获取各种类型中的Title中用户字段 public class func actorName(event: ObjEvent?) -> String? { if let type = event?.type { switch type { case .pushEvent: return event?.actor?.display_login default: return event?.actor?.display_login } } return event?.actor?.display_login } // MARK: - 获取各种类型中的Title中repo字段 public class func repoName(event: ObjEvent?) -> String? { if let type = event?.type { switch type { case .issueCommentEvent: return event?.repo?.name case .pullRequestEvent: return event?.repo?.name default: return event?.repo?.name } } return event?.repo?.name } // MARK: - 获取各种类型中的文本字段 public class func contentBody(event: ObjEvent?) -> String? { if let type = event?.type { switch type { case .issuesEvent: return event?.payload?.issue?.title case .issueCommentEvent: return event?.payload?.comment?.body case .pullRequestEvent: return event?.payload?.pull_request?.title case .pullRequestReviewCommentEvent: return event?.payload?.comment?.body case .releaseEvent: return "Source code (zip)" case .commitCommentEvent: return event?.payload?.comment?.body default: return nil } } return nil } // MARK: - 获取各种类型中的Title中动作字段 public class func action(event: ObjEvent?) -> String { var actionText = "" if let type = event?.type { switch type { case .issuesEvent: if let action = event?.payload?.action { actionText = " "+action.rawValue + " issue" } case .watchEvent: if let act = event?.payload?.action?.rawValue { actionText = " "+act+" " } case .pushEvent: actionText = " pushed to " case .issueCommentEvent: //commented on issue/pull request if event?.payload?.issue?.pull_request != nil { actionText = " commented on pull request" } else { actionText = " commented on issue" } case .pullRequestEvent: if let action = event?.payload?.action { actionText = " "+action.rawValue + " pull request" } case .pullRequestReviewCommentEvent: if event?.payload?.pull_request != nil && event?.payload?.comment != nil { actionText = " commented on pull request" } case .releaseEvent: if event?.payload?.release != nil { actionText = " released " } case .createEvent: if let type = event?.payload?.ref_type { actionText = " created "+type+" " } case .forkEvent: if event?.payload?.forkee != nil { actionText = " forked " } case .deleteEvent: if let type = event?.payload?.ref_type { actionText = " deleted "+type+" " } case .memberEvent: if let action = event?.payload?.action?.rawValue, event?.payload?.member != nil { actionText = " \(action) " } case .commitCommentEvent: if event?.payload?.comment != nil { actionText = " commented on commit " } case .gollumEvent: if let pages = event?.payload?.pages { let page: ObjPage = pages.first! let act = page.action! actionText = " \(act) a wiki page in" } default: break } } return actionText } // MARK: - 各种Event的布局类型 public class func layoutType(event: ObjEvent?) -> EventLayoutStyle { if let type = event?.type { switch type { case .commitCommentEvent: return .textPicture case .createEvent: return .text case .deleteEvent: return .text case .deploymentEvent: return .textPicture case .deploymentStatusEvent: return .textPicture case .downloadEvent: return .textPicture case .followEvent: return .text case .forkEvent: return .text case .forkApplyEvent: return .text case .gistEvent: return .textPicture case .issuesEvent: return .textPicture case .issueCommentEvent: return .textPicture case .memberEvent: return .text case .membershipEvent: return .textPicture case .pageBuildEvent: return .textPicture case .publicEvent: return .textPicture case .pullRequestEvent: return .pullRequest case .pullRequestReviewCommentEvent: return .textPicture case .pushEvent: return .pushCommit case .releaseEvent: return .textPicture case .repositoryEvent: return .textPicture case .statusEvent: return .textPicture case .teamAddEvent: return .textPicture case .watchEvent: return .text case .gollumEvent: return .textPicture default: return .textPicture } } return .textPicture } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventCommitView.swift ================================================ // // BFEventCommitView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText /* user pushed to repos ╭┈┈┈╮ | | 76027aa Merge pull request #489 from ahstro/patch-1 ╰┈┈┈╯ 说明: ╭┈┈┈╮ | | 76027aa Merge pull request #489 from ahstro/patch-1 ╰┈┈┈╯ user avatar commit hash commit conent */ // 以上由于头像图不好拿,故略去 class BFEventCommitView: UIView { //数据 var cell: BFEventCell? var layout: BFEventLayout? var commitLabel: YYLabel = YYLabel() override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = BFEventConstants.PRDETAIL_W newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true commitLabel.size = CGSize(width: self.width, height: self.height) // commitLabel.backgroundColor = UIColor.hex("#eaf5ff") commitLabel.numberOfLines = 1 commitLabel.displaysAsynchronously = true commitLabel.ignoreCommonProperties = true commitLabel.fadeOnAsynchronouslyDisplay = false commitLabel.fadeOnHighlight = false self.addSubview(commitLabel) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout // commitLabel.layer.contents = nil commitLabel.height = self.layout!.commitHeight commitLabel.textLayout = self.layout?.commitLayout } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventPRDetailView.swift ================================================ // // BFEventCommitDetailView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText /* 在opened pull request时,会有这个pull request详情 ------------------------------------------------ | -0- 1 commit with 1 addition and 0 deletions | ------------------------------------------------ */ class BFEventPRDetailView: UIView { //数据 var cell: BFEventCell? var layout: BFEventLayout? var detailLabel: YYLabel = YYLabel() override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = BFEventConstants.PRDETAIL_W newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true detailLabel.size = CGSize(width: self.width, height: self.height) detailLabel.backgroundColor = UIColor.hex("#eaf5ff") detailLabel.numberOfLines = 1 detailLabel.displaysAsynchronously = true detailLabel.ignoreCommonProperties = true detailLabel.fadeOnAsynchronouslyDisplay = false detailLabel.fadeOnHighlight = false self.addSubview(detailLabel) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout // detailLabel.layer.contents = nil detailLabel.width = self.layout!.prDetailWidth detailLabel.height = self.layout!.prDetailHeight detailLabel.textLayout = self.layout?.prDetailLayout } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventTextView.swift ================================================ // // BFEventActionContentView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText /* 每个event payload中的具体内容 例如: */ class BFEventTextView: UIView { //数据 var cell: BFEventCell? var layout: BFEventLayout? var textLabel: YYLabel = YYLabel() override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = BFEventConstants.TEXT_W newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true textLabel.size = CGSize(width: self.width, height: self.height) textLabel.displaysAsynchronously = true textLabel.ignoreCommonProperties = true textLabel.fadeOnAsynchronouslyDisplay = false textLabel.fadeOnHighlight = false textLabel.numberOfLines = 3 self.addSubview(textLabel) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout // textLabel.layer.contents = nil textLabel.height = self.layout!.textHeight textLabel.textLayout = self.layout?.textLayout } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventTimeView.swift ================================================ // // BFEventTimeView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText class BFEventTimeView: UIView { var timeLabel: YYLabel = YYLabel() //数据 var cell: BFEventCell? var layout: BFEventLayout? override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = BFEventConstants.TIME_W newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true timeLabel.size = CGSize(width: self.width, height: self.height) timeLabel.ignoreCommonProperties = true timeLabel.displaysAsynchronously = true timeLabel.fadeOnAsynchronouslyDisplay = false timeLabel.fadeOnHighlight = false self.addSubview(timeLabel) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout timeLabel.layer.contents = nil timeLabel.height = self.layout!.timeHeight timeLabel.textLayout = self.layout?.timeLayout } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventTitleView.swift ================================================ // // BFEventActionView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText /* event title 每个event的简短描述 例如: aure commented on issue AudioKit/AudioKit#1053 jldunk opened issue AudioKit/AudioKit#1054 jcavar opened pull request ckrey/MQTT-Client-Framework#376 jashkenas created repository jashkenas/lil-license */ class BFEventTitleView: UIView { //数据 var cell: BFEventCell? var layout: BFEventLayout? var titleLabel: YYLabel = YYLabel() override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = BFEventConstants.TITLE_W newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true titleLabel.size = CGSize(width: self.width, height: self.height) titleLabel.displaysAsynchronously = true titleLabel.ignoreCommonProperties = true titleLabel.fadeOnAsynchronouslyDisplay = false titleLabel.fadeOnHighlight = false titleLabel.numberOfLines = 0 self.addSubview(titleLabel) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout // titleLabel.layer.contents = nil titleLabel.height = self.layout!.titleHeight titleLabel.textLayout = self.layout?.titleLayout // titleLabel.attributedText = layout.titleAttreText } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFEventView.swift ================================================ // // BFEventView.swift // BeeFun // // Created by WengHengcong on 23/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /* event类型1:pull request类型 5 days ago ashfurrow opened pull request AFNetworking/AFNetworking#4051 ╭┈┈┈╮ Exposes C function prototype | | ------------------------------------------------ ╰┈┈┈╯ | -0- 1 commit with 1 addition and 0 deletions | ------------------------------------------------ */ /* event类型2:push commit、release类型 --->>>>>>>> push类型 4 days ago davemachado pushed to master at toddmotto/public-apis ╭┈┈┈╮ ╭-╮ 2f9b6f0 Merge pull request #486 from DustyReagan/countio | | ╰—╯ ╰┈┈┈╯ ╭-╮ 4e79d6d Remove '... API' from Description ╰—╯ View comparison for these 2 commits » or 15 more commits » 注意:后面有两种类型,一种是查看这两个commit的对比,一个是查看更多的commit --->>>>>>>> release类型 4 days ago davemachado pushed to master at toddmotto/public-apis ╭┈┈┈╮ ╭-╮ Source code (zip) | | ╰—╯ ╰┈┈┈╯ 注意:点击source code中直接下载zip文件 */ /* event类型3:opened issue、commented on issue 等类型 5 days ago ashfurrow opened pull request AFNetworking/AFNetworking#4051 ╭┈┈┈╮ | | Format string warnings ╰┈┈┈╯ */ /* event类型4:starred、forked等类型 5 days ago Bogdan-Lyashenko starred byoungd/english-level-up-tips-for-Chinese */ class BFEventView: UIView { var contentView: UIView = UIView() ///整个视图的容器 /// event 左上角的Action 图标,固定 var actionImageView = UIImageView() var timeView: BFEventTimeView? /// 时间 var titleView: BFEventTitleView? /// title /// 内容区域 var actionContentView = UIView() /// 内容区域的容器 var actorImageView = UIImageView() /// event 执行者头像 var textView: BFEventTextView? /// 内容,见类型1、3、4部分的文字内容区域 var prDetailView: BFEventPRDetailView? /// pull request的部分内容区域,见类型1 var commitView: BFEventCommitView? /// push commit的内容区域,见类型2 var topLine: UIView = UIView() var bottomLine: UIView = UIView() //数据 var cell: BFEventCell? var layout: BFEventLayout? override init(frame: CGRect) { var newFrame = frame if frame.size.width == 0 && frame.size.height == 0 { newFrame.size.width = ScreenSize.width newFrame.size.height = 1 } super.init(frame: newFrame) isUserInteractionEnabled = true backgroundColor = .clear contentView.backgroundColor = .clear contentView.isUserInteractionEnabled = true contentView.width = ScreenSize.width contentView.height = 1.0 self.addSubview(contentView) //line let retinaPixelSize = 1.0 / (UIScreen.main.scale) topLine.backgroundColor = UIColor.bfLineBackgroundColor topLine.frame = CGRect(x: 0, y: 0, w: self.width, h: retinaPixelSize) contentView.addSubview(topLine) bottomLine.backgroundColor = UIColor.bfLineBackgroundColor bottomLine.frame = CGRect(x: 0, y: self.height-retinaPixelSize, w: self.width, h: retinaPixelSize) contentView.addSubview(bottomLine) //action image name actionImageView.frame = CGRect(x: BFEventConstants.ACTION_IMG_LEFT, y: BFEventConstants.ACTION_IMG_TOP, w: BFEventConstants.ACTION_IMG_WIDTH, h: BFEventConstants.ACTION_IMG_WIDTH) // actionImageView.isHidden = true actionImageView.image = UIImage(named: "git-comment-discussion_50") actionImageView.isUserInteractionEnabled = true contentView.addSubview(actionImageView) //time timeView = BFEventTimeView() // timeView?.isHidden = true contentView.addSubview(timeView!) //title titleView = BFEventTitleView() // titleView?.isHidden = true contentView.addSubview(titleView!) //内容区域 actionContentView.backgroundColor = .clear actionContentView.isUserInteractionEnabled = true // actionContentView.isHidden = true contentView.addSubview(actionContentView) //actor image view actorImageView.frame = CGRect(x: 0, y: 0, w: BFEventConstants.ACTOR_IMG_WIDTH, h: BFEventConstants.ACTOR_IMG_WIDTH) actorImageView.isHidden = true actionContentView.addSubview(actorImageView) //text view textView = BFEventTextView() textView?.isHidden = true actionContentView.addSubview(textView!) //pull request detail view prDetailView = BFEventPRDetailView() prDetailView?.isHidden = true actionContentView.addSubview(prDetailView!) //commit view commitView = BFEventCommitView() commitView?.isHidden = true actionContentView.addSubview(commitView!) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setLayout(layout: BFEventLayout) { self.layout = layout //contnet view的位置 contentView.top = layout.marginTop contentView.height = layout.totalHeight - layout.marginTop - layout.marginBottom contentView.left = layout.marginLeft contentView.right = ScreenSize.width - layout.marginLeft //action image if let actionImageName = layout.eventTypeActionImage { actionImageView.image = UIImage(named: actionImageName) } //time timeView?.origin = CGPoint(x: BFEventConstants.TIME_X, y: BFEventConstants.TIME_Y) // timeView?.backgroundColor = UIColor.red if layout.timeHeight > 0 { timeView?.isHidden = false timeView?.height = layout.timeHeight timeView?.setLayout(layout: layout) } else { timeView?.isHidden = true } //title titleView?.origin = CGPoint(x: timeView!.left, y: timeView!.bottom) // titleView?.backgroundColor = UIColor.green if layout.titleHeight > 0 { titleView?.isHidden = false titleView?.height = layout.titleHeight titleView?.setLayout(layout: layout) } else { titleView?.isHidden = true } //-------------->>>>>> actionContentView 内容区域 <<<<<<<------------- actionContentView.origin = CGPoint(x: titleView!.left, y: titleView!.bottom) // actionContentView.backgroundColor = UIColor.red actionContentView.width = BFEventConstants.ACTION_CONTENT_WIDTH actionContentView.height = layout.actionContentHeight //actor image if let avatarUrl = layout.event?.actor?.avatar_url, let url = URL(string: avatarUrl) { actorImageView.isHidden = false actorImageView.origin = CGPoint(x: BFEventConstants.ACTOR_IMG_LEFT, y: BFEventConstants.ACTOR_IMG_TOP) actorImageView.kf.setImage(with: url) } else { actorImageView.isHidden = true } if let type = layout.event?.type { if type == .watchEvent { actorImageView.isHidden = true } } if layout.prDetailHeight > 0 { //pull request 中,同样有text textView?.origin = CGPoint(x: BFEventConstants.TEXT_X, y: BFEventConstants.TEXT_Y) // textView?.backgroundColor = .red if layout.textHeight > 0 { textView?.isHidden = false textView?.height = layout.textHeight textView?.setLayout(layout: layout) } else { textView?.isHidden = true } commitView?.isHidden = true prDetailView?.isHidden = false prDetailView?.origin = CGPoint(x: textView!.left, y: textView!.bottom) prDetailView?.height = layout.prDetailHeight prDetailView?.setLayout(layout: layout) } else if layout.commitHeight > 0 { prDetailView?.isHidden = true textView?.isHidden = true commitView?.isHidden = false commitView?.origin = CGPoint(x: BFEventConstants.COMMIT_X, y: BFEventConstants.COMMIT_Y) commitView?.height = layout.commitHeight commitView?.setLayout(layout: layout) } else { prDetailView?.isHidden = true commitView?.isHidden = true //text textView?.origin = CGPoint(x: BFEventConstants.TEXT_X, y: BFEventConstants.TEXT_Y) if layout.textHeight > 0 { textView?.isHidden = false textView?.height = layout.textHeight textView?.setLayout(layout: layout) } else { textView?.isHidden = true } } switch layout.style { case .pullRequest: actionContentView.isHidden = false case .pushCommit: actionContentView.isHidden = false case .textPicture: actionContentView.isHidden = false case .text: actionContentView.isHidden = true break } } } ================================================ FILE: BeeFun/BeeFun/View/Event/NotUse/BFImageViewAttachment.swift ================================================ // // BFEventCellImageViewAttachment.swift // BeeFun // // Created by WengHengcong on 22/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText class BFImageViewAttachment: YYTextAttachment { var imageURL: URL? var size: CGSize? private var _imageView: UIImageView? override var content: Any? { set { _imageView = content as? UIImageView } get { /// UIImageView 只能在主线程访问 if pthread_main_np() == 0 { return nil } if _imageView != nil { return _imageView } /// 第一次获取时 (应该是在文本渲染完成,需要添加附件视图时),初始化图片视图,并下载图片 /// 这里改成 YYAnimatedImageView 就能支持 GIF/APNG/WebP 动画了 _imageView = UIImageView() _imageView?.size = size ?? CGSize.zero _imageView?.kf.setImage(with: imageURL) return _imageView } } } ================================================ FILE: BeeFun/BeeFun/View/Gist/BFGistViewController.swift ================================================ // // CPGistViewController.swift // BeeFun // // Created by wenghengcong on 15/12/30. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit class BFGistViewController: BFBaseViewController { override func viewDidLoad() { super.viewDidLoad() } override func reconnect() { super.reconnect() } } ================================================ FILE: BeeFun/BeeFun/View/Issue/ViewCell/CPMesIssueCell.swift ================================================ // // CPMesIssueCell.swift // BeeFun // // Created by WengHengcong on 3/7/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class CPMesIssueCell: BFBaseCell { @IBOutlet weak var issueTitleBtn: UIButton! @IBOutlet weak var numberLabel: UILabel! @IBOutlet weak var reposNameLabel: UILabel! @IBOutlet weak var stateLabel: UILabel! @IBOutlet weak var assignLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! var issue: ObjIssue? { didSet { notiCell_fillData() } } override func p_customCellView() { super.p_customCellView() // numberLabel.textColor = UIColor.bfLabelSubtitleTextColor issueTitleBtn.isUserInteractionEnabled = false reposNameLabel.textColor = UIColor.bfLabelSubtitleTextColor stateLabel.textColor = UIColor.bfLabelSubtitleTextColor assignLabel.textColor = UIColor.bfLabelSubtitleTextColor timeLabel.textColor = UIColor.bfLabelSubtitleTextColor } func notiCell_fillData() { let issueTitle = issue!.title issueTitleBtn.setTitle(issueTitle, for: UIControl.State()) if let number = issue?.number { let issueNum = "#\(number)" numberLabel.text = issueNum } else { numberLabel.text = "" } if let reposName = issue?.repository?.name { reposNameLabel.text = reposName } else { if let repoUrl = issue?.repository_url { if let repoName = repoUrl.components(separatedBy: "/").last { reposNameLabel.text = repoName } } } if let issueState = issue?.state { stateLabel.text = issueState } else { stateLabel.text = "" } if issue!.assignee == nil { assignLabel.text = "unassignned" } else { assignLabel.text = issue!.assignee!.login } //time if (issue?.created_at) != nil { timeLabel.text = BFTimeHelper.shared.readableTime(rare: issue!.created_at, prefix: nil) } else { timeLabel.text = "" } } } ================================================ FILE: BeeFun/BeeFun/View/Issue/ViewCell/CPMesIssueCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Message/BFMessageConentView.swift ================================================ // // BFMessageConentView.swift // BeeFun // // Created by WengHengcong on 13/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import YYText class BFMessageConentView: UIView, UITableViewDelegate, UITableViewDataSource, MJRefreshManagerAction { var index: Int = 0 // MARK: - View var tableView: UITableView = UITableView() let refreshManager = MJRefreshManager() // MARK: - Data var notificationsData: [ObjNotification] = [] var issuesData: [ObjIssue] = [] var eventsData: [ObjEvent] = [] // MARK: request parameters //notification var notiAllPar: String = "false" var notiPartPar: String = "false" var notiCurrentPage = 1 //issue var issueFilterPar: String = "all" var issueStatePar: String = "all" var issueLabelsPar: String = "" var issueSortPar: String = "created" var issueDirectionPar: String = "desc" var issueCurrentPage: Int = 1 /// Event var eventRequestLoding = false var eventCurrentPage = 1 var layouts: [BFEventLayout] = [] weak var delegate: BFViewControllerNetworkProtocol? override init(frame: CGRect) { super.init(frame: frame) } convenience init(frame: CGRect, index: Int) { self.init(frame: frame) self.index = index isUserInteractionEnabled = true setupTableView() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setupTableView() { tableView.isUserInteractionEnabled = true tableView.frame = self.bounds tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none refreshManager.delegate = self tableView.mj_header = refreshManager.header() tableView.mj_footer = refreshManager.footer() tableView.backgroundColor = UIColor.bfViewBackgroundColor if #available(iOS 11, *) { tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 } self.addSubview(tableView) } func headerRefresh() { tableView.mj_header.endRefreshing() if self.index == 0 { if eventRequestLoding { //正在加载中不需要再次 return } eventCurrentPage = 1 } else if self.index == 1 { issueCurrentPage = 1 } else if self.index == 2 { notiCurrentPage = 1 } refreshData() } func footerRefresh() { tableView.mj_footer.endRefreshing() if self.index == 0 { if eventRequestLoding { //正在加载中不需要再次 return } eventCurrentPage += 1 } else if self.index == 1 { issueCurrentPage += 1 } else if self.index == 2 { notiCurrentPage += 1 } refreshData() } func refreshData() { if UserManager.shared.isLogin {//已登录 tableView.mj_footer.isHidden = false if self.index == 0 { mc_getUserEventsRequest(eventCurrentPage) } else if self.index == 1 { mc_getIssuesRequest(issueCurrentPage) } else if self.index == 2 { mc_getNotificationsRequest(notiCurrentPage) } } else { tableView.mj_footer.isHidden = true } } /// 外界加载用 func reloadNetworkData() { if UserManager.shared.isLogin {//已登录 tableView.mj_footer.isHidden = false if self.index == 0 && eventsData.count == 0 { mc_getUserEventsRequest(eventCurrentPage) } else if self.index == 1 && issuesData.count == 0 { mc_getIssuesRequest(issueCurrentPage) } else if self.index == 2 && notificationsData.count == 0 { mc_getNotificationsRequest(notiCurrentPage) } else { if BFNetworkManager.shared.isReachable { self.delegate?.networkSuccssful() } else { self.delegate?.networkFailure() } } } else { //加载未登录的页面 tableView.mj_footer.isHidden = true } } func reloadTableData() { tableView.reloadData() } // MARK: - UITableViewDatasource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if self.index == 0 { return self.eventsData.count } else if self.index == 1 { return self.issuesData.count } else if self.index == 2 { return self.notificationsData.count } return 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row var cellId = "" if self.index == 2 { cellId = "CPMesNotificationCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? CPMesNotificationCell if cell == nil { cell = (CPMesNotificationCell.cellFromNibNamed("CPMesNotificationCell") as? CPMesNotificationCell) } cell?.setBothEndsLines(row, all: notificationsData.count) let noti = self.notificationsData[row] cell?.noti = noti return cell! } else if self.index == 1 { cellId = "CPMesIssueCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? CPMesIssueCell if cell == nil { cell = (CPMesIssueCell.cellFromNibNamed("CPMesIssueCell") as? CPMesIssueCell) } cell?.setBothEndsLines(row, all: issuesData.count) let issue = self.issuesData[row] cell!.issue = issue return cell! } var cell: BFEventCell? cellId = "BFEventCell" cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFEventCell if cell == nil { cell = BFEventCell.init(style: .default, reuseIdentifier: cellId) } if indexPath.row < self.layouts.count { let layout = self.layouts[indexPath.row] cell?.setLayout(layout: layout) } return cell! } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if self.index == 0 { if indexPath.row < self.layouts.count { let layout = self.layouts[indexPath.row] return layout.totalHeight } return 0 } else if self.index == 1 { return 75 } else if self.index == 2 { return 55 } return 0 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row if self.index == 1 { if issuesData.isBeyond(index: row) { return } let issue: ObjIssue = issuesData[row] JumpManager.shared.jumpIssueDetailView(issue: issue) } } } extension BFMessageConentView { // MARK: - fetch data form request /// 获取通知 func mc_getNotificationsRequest(_ pageVal: Int) { var perPage: Int = 15 if DeviceType.isPad { perPage = 25 } let hud = JSMBHUDBridge.showHud(view: self) Provider.sharedProvider.request( .myNotifications(page:pageVal, perpage:perPage, all:notiAllPar, participating:notiPartPar) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { self.delegate?.networkSuccssful() let notis: [ObjNotification] = try response.mapArray(ObjNotification.self) if pageVal == 1 { self.notificationsData.removeAll() self.notificationsData = notis } else { self.notificationsData += notis } self.tableView.reloadData() return } catch { self.delegate?.networkFailure() } case .failure: self.delegate?.networkFailure() } } } ///获取Issue func mc_getIssuesRequest(_ pageVal: Int) { var perPage: Int = 15 if DeviceType.isPad { perPage = 25 } let hud = JSMBHUDBridge.showHud(view: self) IssueProvider.sharedProvider.request(.allIssues( page:pageVal, perpage:perPage, filter:issueFilterPar, state:issueStatePar, labels:issueLabelsPar, sort:issueSortPar, direction:issueDirectionPar) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { self.delegate?.networkSuccssful() let issues: [ObjIssue] = try response.mapArray(ObjIssue.self) if pageVal == 1 { self.issuesData.removeAll() self.issuesData = issues } else { self.issuesData += issues } self.tableView.reloadData() return } catch { self.delegate?.networkFailure() } case .failure: self.delegate?.networkFailure() } } } ///获取event func mc_getUserEventsRequest(_ pageVal: Int) { if eventRequestLoding { //正在加载的不请求 return } var perPage: Int = 15 if DeviceType.isPad { perPage = 25 } let hud = JSMBHUDBridge.showHud(view: self) eventRequestLoding = true EventProvider.sharedProvider.request(.userReceivedEvents(username:UserManager.shared.login!, page:pageVal, perpage:perPage)) { (result) -> Void in self.eventRequestLoding = false hud.hide(animated: true) switch result { case let .success(response): do { self.delegate?.networkSuccssful() let events: [ObjEvent] = try response.mapArray(ObjEvent.self) var indexPaths: [IndexPath] = [] if pageVal == 1 { self.eventsData.removeAll() self.eventsData = events self.layouts.removeAll() } else { for i in 0.. Int { // if !checkCurrentLoginState() { return 0 } return segControl.sectionTitles.count } //1. 先获取view func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { let contentView = BFMessageConentView.init(frame: carouselContent.bounds, index: index) contentView.delegate = self contentView.reloadNetworkData() return contentView } func carouselCurrentItemIndexDidChange(_ carousel: iCarousel) { if !checkCurrentLoginState() { return } if !clickSegmentControl { segControl.setSelectedSegmentIndex(UInt(carouselContent.currentItemIndex), animated: true) } clickSegmentControl = false reloadCurrentContentData() } } extension BFMessageController { func networkSuccssful() { removeReloadView() } func networkFailure() { showReloadView() } } ================================================ FILE: BeeFun/BeeFun/View/Message/InsetNavigationBar.swift ================================================ // // InsetButtonsNavigationBar.swift // BeeFun // // Created by WengHengcong on 13/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class InsetNavigationBar: UINavigationBar { override func layoutSubviews() { super.layoutSubviews() // iOS now throws if we mutate layout margins on private nav bar subviews. // Keep customization on the public UINavigationBar instance only. layoutMargins = .zero } } ================================================ FILE: BeeFun/BeeFun/View/NewTrending/BFNewTrendingController.swift ================================================ // // BFNewTrendingController.swift // BeeFun // // Created by WengHengcong on 2018/8/25. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit class BFNewTrendingController: BFBaseViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: BeeFun/BeeFun/View/Notification/ViewCell/CPMesNotificationCell.swift ================================================ // // CPMesNotificationCell.swift // BeeFun // // Created by WengHengcong on 3/7/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class CPMesNotificationCell: BFBaseCell { @IBOutlet weak var typeImageV: UIImageView! @IBOutlet weak var notificationLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var reposBtn: UIButton! var noti: ObjNotification? { didSet { notiCell_fillData() } } override func p_customCellView() { super.p_customCellView() //test //if you want to change position or size by set frame property,you first disable autolayout. // typeImageV.frame = CGRectMake(50, 10, 44, 44); } func notiCell_fillData() { if let type = noti?.subject?.type { let notiType: SubjectType? = SubjectType(rawValue: type) if notiType != nil { typeImageV.isHidden = false switch notiType! { case .issue: typeImageV.image = UIImage(named: "octicon_issue_25") case .pullRequest: typeImageV.image = UIImage(named: "octicon_pull_request_25") case .release: typeImageV.image = UIImage(named: "coticon_tag_25") case .commit: typeImageV.image = UIImage(named: "octicon_commit_25") } } else { typeImageV.isHidden = true } } if let title = noti?.subject?.title { notificationLabel.text = title } if let name = noti?.repository?.name { reposBtn.setTitle(name, for: UIControl.State()) } if let time = noti?.updated_at { //time timeLabel.text = BFTimeHelper.shared.readableTime(rare: time, prefix: nil) } } } ================================================ FILE: BeeFun/BeeFun/View/Notification/ViewCell/CPMesNotificationCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Profile/BFProfileController+Data.swift ================================================ // // BFProfileController+Data.swift // BeeFun // // Created by WengHengcong on 01/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import MessageUI extension BFProfileController { func pvc_loadSettingPlistData() { allSettings = BFGlobalHelper.readSettsingPlist("BFProfile") pvc_addActionToCellModel() //Check list: reward开关关闭 self.tableView.reloadData() //TODO: 分享的开关暂时关闭 /* type image id share key Share icon set_share disclosure type image id share key 分享 icon set_share disclosure */ if !ShareManager.shared.enable { } } func pvc_addActionToCellModel() { for first in allSettings { for second in first { let viewType = second.identifier! if viewType == "forked" { second.didSelectClosure = { [weak self] (table, index, model) in if UserManager.shared.needLogin() { if let uname = self?.user!.login { let dic: [String: String] = ["uname": uname, "type": viewType] let vc = BFRepoListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self?.navigationController?.pushViewController(vc, animated: true) } } } } else if viewType == "feedback" { second.didSelectClosure = { [weak self] (table, index, model) in // if let mailComposeViewController = self?.configuredMailComposeViewController() { // if MFMailComposeViewController.canSendMail() { // self?.present(mailComposeViewController, animated: true, completion: nil) // } else { // self?.showSendMailErrorAlert() // } // } let feedbackVc = BFFeedbackController() feedbackVc.hidesBottomBarWhenPushed = true self?.navigationController?.pushViewController(feedbackVc, animated: true) } } else if viewType == "share" { second.didSelectClosure = { (table, index, model) in ShareManager.shared.shareApp() } } else if viewType == "reward" { second.didSelectClosure = { (table, index, model) in // PurchaseManager.shared.getInfo(PurchaseProduct.reward) //PurchaseManager.shared.purchase(PurchaseProduct.reward) } } else if viewType == "tags" { second.didSelectClosure = { [weak self] (table, index, model) in if UserManager.shared.needLogin() { let vc = BFTagsManageController() vc.hidesBottomBarWhenPushed = true self?.navigationController?.pushViewController(vc, animated: true) } } } else if viewType == "lists" { second.didSelectClosure = { [weak self] (table, index, model) in if UserManager.shared.needLogin() { let vc = BFListsManageController() vc.hidesBottomBarWhenPushed = true self?.navigationController?.pushViewController(vc, animated: true) } } } else if viewType == "sync" { second.didSelectClosure = { (table, index, model) in let vc = BFReposSyncController() vc.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(vc, animated: true) } } } } } } ================================================ FILE: BeeFun/BeeFun/View/Profile/BFProfileController.swift ================================================ // // BFProfileController.swift // BeeFun // // Created by wenghengcong on 15/12/30. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit import Foundation import MJRefresh import ObjectMapper import Alamofire //import SwiftyStoreKit import MessageUI class BFProfileController: BFBaseViewController { var personCardV: CPPersonCardView = CPPersonCardView() var imagePicker = UIImagePickerController() var isLogin: Bool = false var user: ObjUser? var allSettings: [[JSCellModel]] = [] let cellId = "CPProfileCellIdentifier" var data: NSMutableData = NSMutableData() // MARK: - view cycle override func viewDidLoad() { self.title = "Profile".localized super.viewDidLoad() pvc_loadSettingPlistData() pvc_customView() pvc_setupTableView() pvc_addNavigationbar() NotificationCenter.default.addObserver(self, selector: #selector(BFProfileController.pvc_updateUserinfoData), name: NSNotification.Name.BeeFun.DidLogin, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(BFProfileController.pvc_updateUserinfoData), name: NSNotification.Name.BeeFun.DidLogout, object: nil) self.leftItem?.isHidden = true } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) pvc_updateUserinfoData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } deinit { NotificationCenter.default.removeObserver(self) } // MARK: - load data //登录成功后刷新数据 @objc func pvc_updateUserinfoData() { isLogin = UserManager.shared.isLogin user = UserManager.shared.user personCardV.user = user if isLogin { // pvc_getUserinfoRequest() pvc_getMyinfoRequest() MobClick.profileSignIn(withPUID: UserManager.shared.login) } else { MobClick.profileSignOff() } } func pvc_isLogin() -> Bool { if !UserManager.shared.needLogin() { return false } return true } // MARK: - view /// 不在导航栏有按钮,不方便 func pvc_addNavigationbar() { self.rightItemImage = UIImage(named: "set_settings_white") self.rightItemSelImage = UIImage(named: "set_settings_white") self.rightItem?.isHidden = false } func pvc_customView() { self.refreshHidden = .all self.view.backgroundColor = UIColor.white self.view.addSubview(personCardV) personCardV.frame = CGRect(x: 0, y: uiTopBarHeight, w: ScreenSize.width, h: 142) personCardV.delegate = self } func pvc_updateViewWithUserData() { if isLogin { personCardV.user = self.user } else { personCardV.user = nil } self.removeReloadView() self.tableView.reloadData() } func pvc_setupTableView() { self.view.addSubview(tableView) let tabY = personCardV.bottom let tabH = ScreenSize.height-tabY-uiTabBarHeight self.tableView.frame = CGRect(x: 0, y: personCardV.bottom, w: ScreenSize.width, h: tabH) self.tableView.register(UINib(nibName: "JSImageCell", bundle: nil), forCellReuseIdentifier: cellId) //regiseter by xib } // MARK: - Action override func rightItemAction(_ sender: UIButton?) { let setVC = BFSettingsViewController() setVC.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(setVC, animated: true) } // MARK: - segue func pvc_getUserinfoRequest() { var username = "" if UserManager.shared.isLogin { username = UserManager.shared.user!.login! } Provider.sharedProvider.request(.userInfo(username:username) ) { (result) -> Void in var message = kNoDataFoundTip switch result { case let .success(response): do { if let result: ObjUser = Mapper().map(JSONObject: try response.mapJSON() ) { ObjUser.saveUserInfo(result) self.user = result self.pvc_updateViewWithUserData() } else { } } catch { JSMBHUDBridge.showError(message, view: self.view) } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } extension BFProfileController: PersonCardViewActionProtocol { // MARK: - 编辑用户 func editMyProfileAction() { let editVc = BFEditUserController() editVc.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(editVc, animated: true) } /// 更换用户背景图 func userChangeBackgroundImageAction() { imagePicker.delegate = self imagePicker.navigationBar.isTranslucent = false imagePicker.sourceType = .photoLibrary imagePicker.navigationBar.barTintColor = UIColor.bfRedColor imagePicker.navigationBar.tintColor = UIColor.white imagePicker.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.white ] imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil) } /// 获取用户信息 func pvc_getMyinfoRequest() { Provider.sharedProvider.request(.myInfo ) { (result) -> Void in var message = kNoDataFoundTip switch result { case let .success(response): do { if let result: ObjUser = Mapper().map(JSONObject: try response.mapJSON() ) { ObjUser.saveUserInfo(result) self.user = result self.isLogin = UserManager.shared.isLogin self.personCardV.user = self.user self.pvc_updateViewWithUserData() } } catch { JSMBHUDBridge.showError(message, view: self.view) } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } override func reconnect() { super.reconnect() pvc_getMyinfoRequest() } override func request() { super.request() pvc_getMyinfoRequest() } override func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } //登录按钮,点击打开登录页面 func userLoginAction() { OAuthManager.shared.beginOauth() } // MARK: - 顶部点击跳转:项目、粉丝、关注 func viewMyReposAction() { if UserManager.shared.needLogin() { let uname = user!.login let dic: [String: String] = ["uname": uname!, "type": "myrepositories"] let vc = BFRepoListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) } } func viewMyFollowerAction() { if UserManager.shared.needLogin() { let uname = user!.login let dic: [String: String] = ["uname": uname!, "type": "follower"] let vc = BFUserListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) } else { } } func viewMyFollowingAction() { if UserManager.shared.needLogin() { let uname = user!.login let dic: [String: String] = ["uname": uname!, "type": "following"] let vc = BFUserListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) } } } extension BFProfileController:UIImagePickerControllerDelegate, UINavigationControllerDelegate { func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { /* Swift Dictionary named “info”. We have to unpack it from there with a key asking for what media information we want. We just want the image, so that is what we ask for. For reference, the available options are: UIImagePickerControllerMediaType UIImagePickerControllerOriginalImage UIImagePickerControllerEditedImage UIImagePickerControllerCropRect UIImagePickerControllerMediaURL UIImagePickerControllerReferenceURL UIImagePickerControllerMediaMetadata */ if let pickedImage = info[.originalImage] as? UIImage { var imgData: Data? if let refreUrl = info[.referenceURL] { if let convertURl = refreUrl as? URL { let refUrl: URL = convertURl let refUrlStr = refUrl.absoluteString.lowercased() let pngRange = refUrlStr.range(of: "png", options: String.CompareOptions.literal, range: refUrlStr.startIndex.. Int { return allSettings.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionArr = allSettings[section] return sectionArr.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let section = (indexPath as NSIndexPath).section let row = indexPath.row let rowOfSettings: JSCellModel = allSettings[section][row] let sectionOfSettings = allSettings[section] var cell = tableView.dequeueReusableCell(withIdentifier: "JSImageCellIdentifier") as? JSImageCell if cell == nil { cell = JSCellFactory.cell(type: rowOfSettings.type!) as? JSImageCell } cell?.model = rowOfSettings cell?.bothEndsLine(row, all: sectionOfSettings.count) return cell! } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let view: UIView = UIView(frame: CGRect(x: 0, y: 0, width: ScreenSize.width, height: 10)) view.backgroundColor = UIColor.bfViewBackgroundColor return view } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 10 } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { return nil } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 0 } } extension BFProfileController { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let section = (indexPath as NSIndexPath).section let row = indexPath.row let cellM: JSCellModel = allSettings[section][row] if let cellDidSeleted = cellM.didSelectClosure { cellDidSeleted(tableView, indexPath, cellM) } } } extension BFProfileController: MFMailComposeViewControllerDelegate { func configuredMailComposeViewController() -> MFMailComposeViewController { let mailComposerVC = MFMailComposeViewController() mailComposerVC.mailComposeDelegate = self // Extremely important to set the --mailComposeDelegate-- property, NOT the --delegate-- property mailComposerVC.setToRecipients([KMyIcloudEmail]) mailComposerVC.setCcRecipients([""]) mailComposerVC.setSubject(KMailSubject) mailComposerVC.setMessageBody("", isHTML: false) return mailComposerVC } func showSendMailErrorAlert() { let sendMailErrorAlert = UIAlertView(title: KSendEmailErrorTitle, message: KSendEmailErrorContent, delegate: self, cancelButtonTitle: "Sure".localized) sendMailErrorAlert.show() } // MARK: MFMailComposeViewControllerDelegate func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { controller.dismiss(animated: true, completion: nil) /* switch(result){ case MFMailComposeResultCancelled: return case MFMailComposeResultSent: return case MFMailComposeResultFailed: return case MFMailComposeResultSaved: return default: return } */ } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Feedback/BFFeedbackController.swift ================================================ // // BFFeedbackController.swift // BeeFun // // Created by 翁恒丛 on 2018/7/4. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BFFeedbackController: BFBaseViewController { var titleTextField: UITextField = UITextField() var contentTextView: UITextView = UITextView() var submitBtn: UIButton = UIButton() override func viewDidLoad() { needShowReloadView = false needShowEmptyView = false needShowLoginView = false title = "Feedback".localized super.viewDidLoad() fc_navBar() fc_customeView() } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } override func rightItemAction(_ sender: UIButton?) { let feedIssueVc = BFFeedbackIssueController() feedIssueVc.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(feedIssueVc, animated: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } func fc_navBar() { if let login = UserManager.shared.login, login == BFFeedbackManager.shared.adminLogin { rightItem?.isHidden = false rightItem?.setTitle("View", for: .normal) } } func fc_customeView() { let topBegin: CGFloat = topOffset + 10 let inputH: CGFloat = 50 let leftMargin: CGFloat = 10 let contentWidth: CGFloat = ScreenSize.width - 2*leftMargin titleTextField.placeholder = "bug? function?...".localized titleTextField.radius = 5.0 titleTextField.borderStyle = .roundedRect titleTextField.backgroundColor = UIColor.white titleTextField.font = UIFont.bfSystemFont(ofSize: 17.0) titleTextField.textColor = UIColor.iOS11Black titleTextField.clearButtonMode = .always titleTextField.returnKeyType = .done titleTextField.frame = CGRect(x: leftMargin, y: topBegin, w: contentWidth, h: inputH) view.addSubview(titleTextField) var minusHeight: CGFloat = 80 if ScreenSize.height <= 568 { minusHeight = 180 } let contentH: CGFloat = ScreenSize.height-topOffset-60-60-minusHeight contentTextView.font = UIFont.bfSystemFont(ofSize: 17.0) contentTextView.backgroundColor = UIColor.white contentTextView.radius = 5.0 contentTextView.textColor = UIColor.iOS11Black contentTextView.frame = CGRect(x: leftMargin, y: titleTextField.bottom + 10, w: contentWidth, h: contentH) view.addSubview(contentTextView) submitBtn.setTitle("Submit".localized, for: .normal) submitBtn.setTitle("Submit".localized, for: .highlighted) submitBtn.setTitleColor(UIColor.white, for: .normal) submitBtn.setTitleColor(UIColor.white, for: .highlighted) submitBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 20.0) submitBtn.backgroundColor = UIColor.bfRedColor submitBtn.radius = 5.0 submitBtn.frame = CGRect(x: leftMargin, y: contentTextView.bottom + 35, w: contentWidth, h: 50) submitBtn.addTarget(self, action: #selector(fc_uploadAction), for: UIControl.Event.touchUpInside) view.addSubview(submitBtn) } @objc func fc_uploadAction() { if titleTextField.text == nil || titleTextField.text!.isEmpty { JSMBHUDBridge.showText("Title can't be empty".localized) return } uploadFeedback() } } extension BFFeedbackController: UITextFieldDelegate { } extension BFFeedbackController: UITextViewDelegate { } // MARK: - upload feedback to repo extension BFFeedbackController { func uploadFeedback() { var body: [String: String] = [:] if let title = titleTextField.text { body["title"] = title } if let content = contentTextView.text { body["body"] = content } IssueProvider.sharedProvider.request(IssueAPI.createIssue(owner: "wenghengcong", repo: "BeeFunFeedback", body: body)) { (result) in switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.created.rawValue { _ = self.navigationController?.popViewController(animated: true) } else { JSMBHUDBridge.showInfo(kNetworkErrorTip) } case .failure: break } } } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Feedback/BFFeedbackIssueController.swift ================================================ // // BFFeedbackIssueController.swift // BeeFun // // Created by WengHengcong on 2018/7/6. // Copyright © 2018年 JungleSong. All rights reserved. // import UIKit class BFFeedbackIssueController: BFBaseViewController { var issuesData: [ObjIssue] = [] //issue var issueFilterPar: String = "all" var issueStatePar: String = "all" var issueLabelsPar: String = "" var issueSortPar: String = "created" var issueDirectionPar: String = "desc" var issueCurrentPage: Int = 1 override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } override func viewDidLoad() { super.viewDidLoad() fbi_setupTableView() fbi_selectDataSource() } func fbi_setupTableView() { self.view.addSubview(tableView) self.tableView.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: ScreenSize.height-uiTopBarHeight) self.automaticallyAdjustsScrollViewInsets = false } // 顶部刷新 override func headerRefresh() { super.headerRefresh() issueCurrentPage = 1 fbi_selectDataSource() } // 底部刷新 override func footerRefresh() { super.footerRefresh() issueCurrentPage += 1 fbi_selectDataSource() } func fbi_selectDataSource() { var perPage: Int = 15 if DeviceType.isPad { perPage = 25 } let dic: [String : Any] = [ "page": issueCurrentPage, "per_page": perPage, "filter": issueFilterPar, "state": issueStatePar, "labels": issueLabelsPar, "sort": issueSortPar, "direction": issueDirectionPar ] let hud = JSMBHUDBridge.showHud(view: self.view) let owner = BFFeedbackManager.shared.adminLogin let repo = BFFeedbackManager.shared.feedbackRepo IssueProvider.sharedProvider.request(.repoIssues(owner: owner, repo: repo, para: dic)) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { let issues: [ObjIssue] = try response.mapArray(ObjIssue.self) if self.issueCurrentPage == 1 { self.issuesData.removeAll() self.issuesData = issues } else { self.issuesData += issues } self.tableView.reloadData() return } catch { } case .failure: break } } } // MARK: - UITableViewDatasource override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.issuesData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row var cellId = "CPMesIssueCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? CPMesIssueCell if cell == nil { cell = (CPMesIssueCell.cellFromNibNamed("CPMesIssueCell") as? CPMesIssueCell) } cell?.setBothEndsLines(row, all: issuesData.count) let issue = self.issuesData[row] cell!.issue = issue return cell! } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 75 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row if issuesData.isBeyond(index: row) { return } let issue: ObjIssue = issuesData[row] JumpManager.shared.jumpIssueDetailView(issue: issue) } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Funny/BFFunnyLabViewController.swift ================================================ // // CPFunnyLabViewController.swift // BeeFun // // Created by WengHengcong on 3/25/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class BFFunnyLabViewController: BFBaseViewController { @IBOutlet weak var lab_awardNameTf: UITextField! override func viewDidLoad() { self.title = "Funny Lab" super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } @IBAction func lag_getAward(_ sender: AnyObject) { let userDefault = UserDefaults.standard var awardUrl = "" // auth url: github-awards.com/auth/github if let username = lab_awardNameTf.text { let firstNeedAuth = userDefault.object(forKey: "\(username)needauth") if firstNeedAuth == nil { awardUrl = "http://github-awards.com/auth/github" } else { awardUrl = "http://github-awards.com/users/search?login=\(username)" } // let awardVC = CPFunnyAwardViewController() // awardVC.username = username // awardVC.url = awardUrl // self.navigationController?.pushViewController(awardVC, animated: true) } else { JSMBHUDBridge.showText("Input your github username", view: self.view) return } } // FIXME: 网络重连 override func reconnect() { super.reconnect() } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Funny/CPFunnyAwardViewController.swift ================================================ // // CPFunnyAwardViewController.swift // BeeFun // // Created by WengHengcong on 3/25/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import TOWebViewController class CPFunnyAwardViewController: TOWebViewController { var username: String? override func viewDidLoad() { self.title = "Award" super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/default.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "filename" : "default@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/edit_profile.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Edit Image-50.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/lab_award_50.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "lab_award_50@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/profile_bg.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "profile_bg.jpg", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_about.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "Info-52.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_feedback.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "mail (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "mail.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_list.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "set_list@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "set_list@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_money.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "heart (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "heart.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_rate.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "Thumb Up-52.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_settings.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "setting (4).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "setting (5).png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_settings_white.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "setting (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "setting.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_share.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "share (1).png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "share.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_sync.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "set_sync@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "set_sync@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_tag.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "set_tag@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "set_tag@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ProfileModule.xcassets/Profile/settingsicon/set_watched.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "set_watched@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Setting/BFAboutViewController.swift ================================================ // // CPAboutViewController.swift // BeeFun // // Created by WengHengcong on 3/16/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class BFAboutViewController: BFBaseViewController { var logoImage: UIImageView! = UIImageView(image: UIImage(named: "app_logo_90")) var introTextV: UITextView! = UITextView() var allSettings: [[JSCellModel]] = [] override func viewDidLoad() { self.title = "About".localized super.viewDidLoad() pavc_readPlist() pavc_setupTableView() pavc_customView() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func pavc_setupTableView() { refreshHidden = .none self.tableView.isScrollEnabled = false self.automaticallyAdjustsScrollViewInsets = false } func pavc_customView() { self.view.addSubview(logoImage) self.view.addSubview(introTextV) let logoW: CGFloat = 90.0 let logoX = (ScreenSize.width-logoW)/2.0 let logoY: CGFloat = uiTopBarHeight+14.0 logoImage.frame = CGRect(x: logoX, y: logoY, w: logoW, h: logoW) introTextV.font = UIFont.bfSystemFont(ofSize: 14.0) introTextV.textColor = UIColor.black introTextV.text = " BeeFun is a client for github.It is written in Swift language. Welcome more suggestions and reports of bugs come from everyone! Thanks.".localized introTextV.isEditable = false let textY = logoImage.bottom + 12.0 introTextV.frame = CGRect(x: 0, y: textY, w: ScreenSize.width, h: 80.0) self.view.addSubview(tableView) let tableY = introTextV.bottom + 15 let tableH = ScreenSize.height-tableY self.tableView.frame = CGRect(x: 0, y: tableY, w: ScreenSize.width, h: tableH) } func pavc_readPlist() { allSettings = BFGlobalHelper.readSettsingPlist("BFAbout") } } extension BFAboutViewController { func numberOfSections(in tableView: UITableView) -> Int { return allSettings.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionArr = allSettings[section] return sectionArr.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let section = (indexPath as NSIndexPath).section let row = indexPath.row let rowOfSettings: JSCellModel = allSettings[section][row] let sectionOfSettings = allSettings[section] var cell = tableView.dequeueReusableCell(withIdentifier: "AboutJSLabelCellIdentifier") as? JSLabelCell if cell == nil { cell = JSCellFactory.cell(type: rowOfSettings.type!) as? JSLabelCell } cell!.model = rowOfSettings cell?.bothEndsLine(row, all: sectionOfSettings.count) return cell! } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let view: UIView = UIView(frame: CGRect(x: 0, y: 0, width: ScreenSize.width, height: 15)) view.backgroundColor = UIColor.bfViewBackgroundColor return view } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 15 } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { return nil } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 0 } } extension BFAboutViewController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let section = (indexPath as NSIndexPath).section let row = indexPath.row let settings: JSCellModel = allSettings[section][row] let viewType = settings.identifier! var url = "" if viewType == "openlib" { // self.performSegueWithIdentifier(SegueTrendingShowRepositoryDetail, sender: nil) } else if viewType == "website" { // self.performSegueWithIdentifier(SegueTrendingShowRepositoryDetail, sender: nil) } else if viewType == "beefun" { url = AppOfficeSite } else if viewType == "me" { url = "https://github.com/wenghengcong" } JumpManager.shared.jumpWebView(url: url) } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Setting/BFSettingsViewController.swift ================================================ // // BFSettingsViewController.swift // BeeFun // // Created by WengHengcong on 3/16/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class BFSettingsViewController: BFBaseViewController { var logOutBtn: UIButton! = UIButton() var settingsArr: [[JSCellModel]] = [] override func viewDidLoad() { self.title = "Settings".localized super.viewDidLoad() psvc_setupTableView() psvc_customView() psvc_readPlist() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func psvc_customView() { logOutBtn.setTitle("Log Out".localized, for: .normal) logOutBtn.setTitle("Log Out".localized, for: .highlighted) logOutBtn.setTitleColor(UIColor.white, for: .normal) logOutBtn.setTitleColor(UIColor.white, for: .highlighted) logOutBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) logOutBtn.backgroundColor = UIColor.bfRedColor logOutBtn.radius = 3.0 logOutBtn.addTarget(self, action: #selector(BFSettingsViewController.psvc_logoutAction), for: UIControl.Event.touchUpInside) self.view.addSubview(logOutBtn) let logX: CGFloat = 10 let logW = ScreenSize.width-2*logX let logY = tableView.bottom + 37.0 let logH: CGFloat = 40 logOutBtn.frame = CGRect(x: logX, y: logY, w: logW, h: logH) } func psvc_setupTableView() { refreshHidden = .none self.view.addSubview(self.tableView) self.tableView.frame = CGRect(x: 0, y: topOffset, w: ScreenSize.width, h: 253) self.tableView.isScrollEnabled = false self.automaticallyAdjustsScrollViewInsets = false } func psvc_readPlist() { settingsArr = BFGlobalHelper.readSettsingPlist("BFSetting") } @objc func psvc_logoutAction() { if !UserManager.shared.isLogin { JSMBHUDBridge.showText(kLoginFirstTip, view: self.view) return } let alertVC = UIAlertController(title: "Log Out".localized + "?", message: "", preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel".localized, style: .cancel) { (_) in // ... } alertVC.addAction(cancelAction) let OKAction = UIAlertAction(title: "Sure".localized, style: .default) { (_) in UserManager.shared.userSignOut() NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DidLogout, object:nil) _ = self.navigationController?.popViewController(animated: true) } alertVC.addAction(OKAction) self.present(alertVC, animated: true) { // ... } } } extension BFSettingsViewController { func numberOfSections(in tableView: UITableView) -> Int { return settingsArr.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionArr = settingsArr[section] return sectionArr.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let section = (indexPath as NSIndexPath).section let row = indexPath.row let sectionOfSetting = settingsArr[section] let settings: JSCellModel = settingsArr[section][row] let cellId = "SettingsBaseCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? JSBaseCell if cell == nil { cell = JSCellFactory.cell(type:settings.type!) as? JSBaseCell } if settings.identifier == "version" { settings.value = JSApp.appVersion } cell!.model = settings cell?.bothEndsLine(row, all: sectionOfSetting.count) return cell! } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let view: UIView = UIView(frame: CGRect(x: 0, y: 0, width: ScreenSize.width, height: 15)) view.backgroundColor = UIColor.bfViewBackgroundColor return view } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 15 } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { return nil } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 0 } } extension BFSettingsViewController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let section = (indexPath as NSIndexPath).section let row = indexPath.row let settings: JSCellModel = settingsArr[section][row] let viewType = settings.identifier! if viewType == "language" { let viewValue = settings.value if viewValue == "切换到英语" { let alertController = UIAlertController(title: "切换到英语?", message: "Tha app shows in English", preferredStyle: .alert) let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (_) in // ... } alertController.addAction(cancelAction) let OKAction = UIAlertAction(title: "确定", style: .default) { (_) in JSLanguage.setEnglish() JSLanguage.synchronize() self.reloadAllResource() self.navigationController?.popViewController(animated: true) } alertController.addAction(OKAction) self.present(alertController, animated: true) { // ... } } else if viewValue == "Change to Chinese" { let alertController = UIAlertController(title: "Change to Chinese?", message: "App将会显示成中文", preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in // ... } alertController.addAction(cancelAction) let OKAction = UIAlertAction(title: "Sure", style: .default) { (_) in JSLanguage.setChinese() JSLanguage.synchronize() self.reloadAllResource() self.navigationController?.popViewController(animated: true) } alertController.addAction(OKAction) self.present(alertController, animated: true) { // ... } } } else if viewType == "rate" { JSApp.rateUs() } else if viewType == "about" { let aboutVC = BFAboutViewController() self.navigationController?.pushViewController(aboutVC, animated: true) } } } extension BFSettingsViewController { func reloadAllResource() { self.tableView.reloadData() BFTabbarManager.jsTabbarController?.reload() } } ================================================ FILE: BeeFun/BeeFun/View/Profile/Setting/en.lproj/BFAbout.plist ================================================ id beefun type label key BeeFun disclosure type label id me key Me disclosure ================================================ FILE: BeeFun/BeeFun/View/Profile/Setting/zh-Hans.lproj/BFAbout.plist ================================================ id beefun type label key BeeFun disclosure type label id me key 开发者 disclosure ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/BFAddNewTagsController.swift ================================================ // // BFAddNewTagsController.swift // BeeFun // // Created by WengHengcong on 02/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BFAddNewTagsController: BFBaseViewController { var textField = UITextField() var tagsValueChanged: Bool = false // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() atc_viewInit() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { if textField.text != nil && !textField.text!.isEmpty { let willAddTagName = textField.text!.trimmed if willAddTagName.lowercased() == "all" { return } let alertController = UIAlertController(title: "Save Tags?".localized, message: nil, preferredStyle: .alert) alertController.addAction(title: "Cancel".localized, style: .cancel, handler: { (_) in _ = self.navigationController?.popViewController(animated: true) }) alertController.addAction(title: "Save".localized, style: .default, handler: { (_) in self.saveTag() }) self.present(alertController, animated: true, completion: { }) } else { _ = self.navigationController?.popViewController(animated: true) } } /// 保存 override func rightItemAction(_ sender: UIButton?) { saveTag() } func backLastView() { _ = self.navigationController?.popViewController(animated: true) } // MARK: - data func makeNewTagObj() -> ObjTag { let tag = ObjTag() if let tagName = textField.text { tag.name = tagName tag.owner = UserManager.shared.login } return tag } func saveTag() { textField.endEditing(true) //1. 先检查text是否为空 if textField.text != nil && !textField.text!.isEmpty { let willAddTagName = textField.text!.trimmed if willAddTagName.lowercased() == "all" { JSMBHUDBridge.showInfo("'All' is default,change one.".localized) return } let newTag = makeNewTagObj() BeeFunProvider.sharedProvider.request(BeeFunAPI.addTag(tagModel: newTag)) { (result) in switch result { case let .success(response): do { if let tagResponse: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum { if code == BFStatusCode.bfOk { //添加成功 JSMBHUDBridge.showSuccess("Success".localized) NotificationCenter.default.post(name: NSNotification.Name.BeeFun.AddTag, object: nil, userInfo: ["tag": newTag.name!]) self.backLastView() } else if code == BFStatusCode.addTagWhenExist { JSMBHUDBridge.showError("Already exists!".localized, view: self.view) } return } } } catch { } JSMBHUDBridge.showError("Failure".localized) case .failure: //删除失败 JSMBHUDBridge.showError("Failure".localized) } } } else { JSMBHUDBridge.showError("No tag to save".localized, view: self.view) } } // MARK: - view func atc_viewInit() { title = "Add new tag".localized rightItem?.setTitle("Save".localized, for: .normal) rightItem?.isHidden = false let inputH: CGFloat = 50 let backView = UIView() backView.backgroundColor = UIColor.white backView.frame = CGRect(x: 0, y: topOffset, w: ScreenSize.width, h: inputH) view.addSubview(backView) textField.placeholder = "input new tag name".localized textField.font = UIFont.bfSystemFont(ofSize: 17.0) textField.textColor = UIColor.bfRedColor textField.delegate = self textField.clearButtonMode = .always textField.returnKeyType = .done textField.frame = CGRect(x: 15, y: 0, w: ScreenSize.width-15, h: inputH) backView.addSubview(textField) } } extension BFAddNewTagsController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField.text != nil && !textField.text!.isEmpty { tagsValueChanged = true } return true } func textFieldShouldReturn(_ textField: UITextField) -> Bool { saveTag() return true } } ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/BFListsManageController.swift ================================================ // // BFListsManageController.swift // BeeFun // // Created by WengHengcong on 01/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFListsManageController: BFBaseViewController { // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() title = "Lists".localized } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } // FIXME: override func reconnect() { super.reconnect() } } ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/BFReposSyncController.swift ================================================ // // BFReposSyncController.swift // BeeFun // // Created by WengHengcong on 18/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFReposSyncController: BFBaseViewController { var tipLabel = UILabel() var syncButton: UIButton = UIButton() // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() rsc_viewInit() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func rsc_viewInit() { title = "Sync".localized refreshHidden = .all view.addSubview(tableView) view.backgroundColor = .white self.automaticallyAdjustsScrollViewInsets = false let tips = "Immediately sync your star repositories from github.com in silence.".localized let tipFont = UIFont.bfSystemFont(ofSize: 18.0) tipLabel.font = tipFont tipLabel.text = tips tipLabel.numberOfLines = 0 let lblX: CGFloat = 20 let lblW = ScreenSize.width-lblX let height = tips.height(with: ScreenSize.width-10, font: tipFont) + 10 tipLabel.textColor = UIColor.black tipLabel.frame = CGRect(x: lblX, y: 120, w: lblW, h: height) view.addSubview(tipLabel) syncButton.setTitle("Sync".localized, for: .normal) syncButton.setTitle("Sync".localized, for: .highlighted) syncButton.setTitleColor(UIColor.white, for: .normal) syncButton.setTitleColor(UIColor.white, for: .highlighted) syncButton.titleLabel?.font = UIFont.bfSystemFont(ofSize: 20.0) syncButton.backgroundColor = UIColor.bfRedColor syncButton.radius = 5.0 syncButton.addTarget(self, action: #selector(BFReposSyncController.rsc_syncAction), for: UIControl.Event.touchUpInside) view.addSubview(syncButton) let logX: CGFloat = 10 let logW = ScreenSize.width-2*logX let logH: CGFloat = 50 let logY = ScreenSize.height-uiTopBarHeight - 40 syncButton.frame = CGRect(x: logX, y: logY, w: logW, h: logH) } @objc func rsc_syncAction() { BeeFunDBManager.shared.updateServerDB(showTips: true, first: false) } } ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/BFTagsManageController.swift ================================================ // // BFTagsManagerController.swift // BeeFun // // Created by WengHengcong on 01/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import SwipeCellKit import ObjectMapper class BFTagsManageController: BFBaseViewController { var tagsData: [ObjTag] = [] var currentPage: UInt = 1 var perPage: UInt = 15 var sortPara: String? var directionPara: String? var tagFilter: TagFilter = TagFilter() // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() tmc_viewInit() tmc_requestTagsData() tmc_registerNoti() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func tmc_registerNoti() { NotificationCenter.default.addObserver(self, selector: #selector(tmc_handleAddTagsNoti), name: NSNotification.Name.BeeFun.AddTag, object: nil) } @objc func tmc_handleAddTagsNoti() { tmc_requestTagsData() } // MARK: - data func tmc_requestTagsData() { currentPage = 1 sortPara = "name" directionPara = "desc" requestTagsFromBeeFun() } func requestTagsFromBeeFun() { let hud = JSMBHUDBridge.showHud(view: view) if !UserManager.shared.needLoginAlert() { _ = checkCurrentLoginState() hud.hide(animated: true) return } if let owner = UserManager.shared.login { tagFilter.owner = owner } tagFilter.page = currentPage tagFilter.pageSize = perPage tagFilter.sord = directionPara tagFilter.sidx = sortPara var dict: [String: Any] = [:] do { dict = try JSONSerialization.jsonObject(with: try JSONEncoder().encode(tagFilter), options: []) as! [String: Any] } catch { print("tag filter is error") } BeeFunProvider.sharedProvider.request(BeeFunAPI.getAllTags(filter: dict) ) { (result) in hud.hide(animated: true) switch result { case let .success(response): do { if let allTag: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = allTag.codeEnum, code == BFStatusCode.bfOk { if let data = allTag.data { self.handleResponseData(data: data) } } } } catch { } case .failure: break } } } override func reconnect() { super.reconnect() requestTagsFromBeeFun() } override func request() { super.request() requestTagsFromBeeFun() } override func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } func handleResponseData(data: [ObjTag]) { if self.currentPage == 1 { self.tagsData.removeAll() self.tagsData = data let addNewTag = ObjTag() addNewTag.name = "Add new tag".localized tagsData.insert(addNewTag, at: 0) } else { self.tagsData += data } for allTag in tagsData where allTag.name == "All" { tagsData.removeAll(allTag) } tableView.reloadData() } // MARK: - view func tmc_viewInit() { title = "Tags".localized view.addSubview(tableView) view.backgroundColor = .white tableView.frame = CGRect(x: 0, y: topOffset, w: ScreenSize.width, h: ScreenSize.height-topOffset) self.automaticallyAdjustsScrollViewInsets = false } // 顶部刷新 override func headerRefresh() { super.headerRefresh() currentPage = 1 requestTagsFromBeeFun() } // 底部刷新 override func footerRefresh() { super.footerRefresh() currentPage += 1 requestTagsFromBeeFun() } } extension BFTagsManageController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tagsData.count } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 50 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cellId = " " let row = indexPath.row let tag: ObjTag = tagsData[row] if row == 0 { cellId = "AddTagsCell" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? AddTagsCell if cell == nil { cell = (AddTagsCell.cellFromNibNamed("AddTagsCell") as? AddTagsCell) } cell?.showtext = tag.name cell?.setBothEndsLines(row, all: tagsData.count) return cell! } cellId = "ShowTagsCell" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? ShowTagsCell if cell == nil { cell = ShowTagsCell(style: .default, reuseIdentifier: cellId) } cell?.textLabel?.text = tag.name cell?.delegate = self cell?.setBothEndsLines(row, all: tagsData.count) return cell! } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) if indexPath.row == 0 { let vc = BFAddNewTagsController() vc.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(vc, animated: true) } } } // MARK: - Tags 的操作 extension BFTagsManageController { func updateTagByUser(index: Int, orginal from: ObjTag, change to: ObjTag) { if to.name == nil || from.name == nil { return } if !tagsData.isBeyond(index: index) { tagsData[index] = to } let hud = JSMBHUDBridge.showHud(view: view) BeeFunProvider.sharedProvider.request(BeeFunAPI.updateTag(name: from.name!, to: to.name!)) { (result) in hud.hide(animated: true) switch result { case let .success(response): do { if let tagResponse: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum, code == BFStatusCode.bfOk { //更新成功 JSMBHUDBridge.showSuccess("Success".localized) self.tableView.reloadData() NotificationCenter.default.post(name: NSNotification.Name.BeeFun.UpdateTag, object: nil, userInfo: ["from": from.name!, "to": to.name!]) } } } catch { } case .failure: //更新失败 JSMBHUDBridge.showError("Failure".localized) } } } func deleteTagByUser(tag: ObjTag, index: Int) { if tag.name == nil { return } let hud = JSMBHUDBridge.showHud(view: view) BeeFunProvider.sharedProvider.request(BeeFunAPI.deleteTag(name: tag.name!)) { (result) in hud.hide(animated: true) switch result { case let .success(response): do { if let tagResponse: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum, code == BFStatusCode.bfOk { //删除成功 JSMBHUDBridge.showSuccess("Success".localized) let removeIndex = index if removeIndex < self.tagsData.count && removeIndex > 0 { self.tagsData.remove(at: removeIndex) } self.tableView.reloadData() NotificationCenter.default.post(name: NSNotification.Name.BeeFun.DelTag, object: nil, userInfo: ["tag": tag.name!]) return } } } catch { } JSMBHUDBridge.showError("Failure".localized) case .failure: //删除失败 JSMBHUDBridge.showError("Failure".localized) } } } } extension BFTagsManageController : SwipeTableViewCellDelegate { func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? { if orientation == .right { let tag = tagsData[indexPath.row] let edit = SwipeAction(style: .default, title: nil) { _, _ in let alertController = UIAlertController(title: "Edit".localized, message: nil, preferredStyle: .alert) alertController.addTextField(configurationHandler: { (textField) in textField.placeholder = "make a change".localized }) alertController.addAction(title: "Cancel".localized, style: .cancel, handler: { (_) in }) alertController.addAction(title: "OK".localized, style: .default, handler: { (_) in if let firstTextField = alertController.textFields?[0] { if firstTextField.text != nil { if let newTag: ObjTag = tag.copy() as? ObjTag { newTag.name = firstTextField.text?.trimmed self.updateTagByUser(index: indexPath.row, orginal: tag, change: newTag) } } } }) self.present(alertController, animated: true, completion: { }) } edit.hidesWhenSelected = true configure(action: edit, with: .edit) let trash = SwipeAction(style: .destructive, title: nil) { _, _ in let message = "Trash it will remove this tag from star repositories!".localized let alertController = UIAlertController(title: "Trash".localized, message: message, preferredStyle: .alert) alertController.addAction(title: "Cancel".localized, style: .cancel, handler: { (_) in }) alertController.addAction(title: "OK".localized, style: .default, handler: { (_) in self.deleteTagByUser(tag: tag, index: indexPath.row) }) self.present(alertController, animated: true, completion: { }) } trash.hidesWhenSelected = true configure(action: trash, with: .trash) return [trash, edit] } return nil } /* func tableView(_ tableView: UITableView, editActionsOptionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeTableOptions { var options = SwipeTableOptions() options.expansionStyle = orientation == .left ? .selection : .destructive var defaultOptions = SwipeTableOptions() defaultOptions.transitionStyle = .border options.transitionStyle = defaultOptions.transitionStyle options.buttonSpacing = 4 options.backgroundColor = #colorLiteral(red: 0.9467939734, green: 0.9468161464, blue: 0.9468042254, alpha: 1) return options } */ func configure(action: SwipeAction, with descriptor: ActionDescriptor) { action.title = descriptor.title(forDisplayMode: .titleAndImage) action.image = descriptor.image(forStyle: .backgroundColor, displayMode: .titleAndImage) action.backgroundColor = descriptor.color } } enum ActionDescriptor { case edit, trash func title(forDisplayMode displayMode: ButtonDisplayMode) -> String? { guard displayMode != .imageOnly else { return nil } switch self { case .edit: return "Edit".localized case .trash: return "Trash".localized } } func image(forStyle style: ButtonStyle, displayMode: ButtonDisplayMode) -> UIImage? { guard displayMode != .titleOnly else { return nil } let name: String switch self { case .edit: name = "Edit" case .trash: name = "Trash" } return UIImage(named: style == .backgroundColor ? name : name + "-circle") } var color: UIColor { switch self { case .edit : return #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1) case .trash: return #colorLiteral(red: 1, green: 0.2352941176, blue: 0.1882352941, alpha: 1) } } } enum ButtonDisplayMode { case titleAndImage, titleOnly, imageOnly } enum ButtonStyle { case backgroundColor, circular } ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/en.lproj/BFRepoSync.plist ================================================ New item type switched id cellular key Use 2G/3G/4G switched type switched id wifi key Use Wifi switched ================================================ FILE: BeeFun/BeeFun/View/Profile/StarTag/zh-Hans.lproj/BFRepoSync.plist ================================================ New item type switched id cellular key 使用 2G/3G/4G switched type switched id wifi key 使用 Wifi switched ================================================ FILE: BeeFun/BeeFun/View/Profile/User/BFEditUserController.swift ================================================ // // BFEditUserController.swift // BeeFun // // Created by WengHengcong on 2017/4/17. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit import Moya import ObjectMapper import Alamofire class BFEditUserController: BFBaseViewController { var cellModels: [JSCellModel] = [] var switchCell: JSSwitchCell? var cells: [JSBaseCell] = [] // MARK: - Life cycle override func viewDidLoad() { super.viewDidLoad() euc_viewInit() euc_dataInit() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } // MARK: - Action override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } override func rightItemAction(_ sender: UIButton?) { if euc_dataChange() { //有值改变 euc_save() } else { //所有值均未变 popToLastView() } } /// 保存 func euc_save() { view.endEditing(true) // name, email, blog, company, location, hireable, bio let name = textFiledValue(index: 0) ?? "" let email = textFiledValue(index: 1) ?? "" let blog = textFiledValue(index: 2) ?? "" let company = textFiledValue(index: 3) ?? "" let location = textFiledValue(index: 4) ?? "" let bio = textFiledValue(index: 5) ?? "" let hire = switchCell?.value ?? false let para: Parameters = [ "name": name, "email": email, "blog": blog, "company": company, "location": location, "hireable": hire, "bio": bio ] var request = URLRequest(url: URL(string: "https://api.github.com/user")!) request.httpMethod = HTTPMethod.patch.rawValue request.setValue(AppToken.shared.access_token ?? "", forHTTPHeaderField: "Authorization") request.setValue("15.0", forHTTPHeaderField: "timeoutInterval") request.setValue("BeeFun", forHTTPHeaderField: "User-Agent") request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") let paraData = para.jsonData() request.httpBody = paraData let hud = JSMBHUDBridge.showHud(view: self.view) Alamofire.request(request).responseJSON { (response) in hud.hide(animated: true) let message = kNetworkErrorTip if response.response?.statusCode == BFStatusCode.ok.rawValue { switch response.result { case .success: if let gitUser: ObjUser = Mapper().map(JSONObject: response.result.value) { ObjUser.saveUserInfo(gitUser) //post successful noti //更新用户信息 UserManager.shared.updateUserInfo() _ = self.navigationController?.popViewController(animated: true) } else { } case .failure: JSMBHUDBridge.showError(message, view: self.view) } } } } /// 返回上一页 func popToLastView() { _ = self.navigationController?.popViewController(animated: true) } // MARK: - view func euc_viewInit() { title = "Edit".localized rightItem?.setTitle("Save".localized, for: .normal) rightItem?.isHidden = false refreshHidden = .all view.addSubview(tableView) view.backgroundColor = .white self.tableView.frame = CGRect(x: 0, y: topOffset, w: ScreenSize.width, h: ScreenSize.height-topOffset) self.automaticallyAdjustsScrollViewInsets = false } func euc_dataInit() { // name, email, blog, company, location, hireable, bio //0 let nameM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "name", key: "Name".localized, value: UserManager.shared.login?.localized, placeholder: "".localized) cellModels.append(nameM) //1 let emailM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "email", key: "Email".localized, value: UserManager.shared.user?.email?.localized, placeholder: "".localized) cellModels.append(emailM) //2 let blogM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "blog", key: "Blog".localized, value: UserManager.shared.user?.blog?.localized, placeholder: "".localized) cellModels.append(blogM) //3 let companyM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "company", key: "Company".localized, value: UserManager.shared.user?.company?.localized, placeholder: "".localized) cellModels.append(companyM) //4 let locM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "location", key: "Location".localized, value: UserManager.shared.user?.location?.localized, placeholder: "".localized) cellModels.append(locM) //5 let hireM = JSCellModelFactory.switchInit(type: JSCellType.switched.rawValue, id: "hireable", key: "Hireable".localized, switched: UserManager.shared.user?.hireable) cellModels.append(hireM) //6 let bioM = JSCellModelFactory.eidtInit(type: JSCellType.edit.rawValue, id: "bio", key: "Bio".localized, value: UserManager.shared.user?.bio?.localized, placeholder: "".localized) cellModels.append(bioM) tableView.reloadData() } func euc_dataChange() -> Bool { if !cells.isEmpty && cells.count >= 6 { if UserManager.shared.user?.login != textFiledValue(index: 0) || UserManager.shared.user?.email != textFiledValue(index: 1) || UserManager.shared.user?.company != textFiledValue(index: 2) || UserManager.shared.user?.company != textFiledValue(index: 3) || UserManager.shared.user?.location != textFiledValue(index: 4) || UserManager.shared.user?.login != textFiledValue(index: 5) { return true } if UserManager.shared.user?.hireable != switchCell?.value { return true } return false } return false } func textFiledValue(index: Int) -> String? { if cells.isEmpty { return nil } if cells.isBeyond(index: index) { return nil } if let cell = cells[index] as? JSEditCell { return cell.value } return nil } } extension BFEditUserController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return cellModels.count } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellModel = cellModels[row] if row == 5 { var cell = tableView.dequeueReusableCell(withIdentifier: "EditUserIdentifierSwtich") as? JSSwitchCell if cell == nil { cell = JSCellFactory.cell(type:cellModel.type!) as? JSSwitchCell } cell?.model = cellModel cell?.bothEndsLine(row, all: cellModels.count) switchCell = cell return cell! } var cell = tableView.dequeueReusableCell(withIdentifier: "EditUserIdentifier") as? JSEditCell if cell == nil { cell = JSCellFactory.cell(type:cellModel.type!) as? JSEditCell } cell?.model = cellModel cell?.bothEndsLine(row, all: cellModels.count) cells.append(cell!) return cell! } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated:true) } } ================================================ FILE: BeeFun/BeeFun/View/Profile/ViewCell/CPPersonCardView.swift ================================================ // // CPPersonCardView.swift // BeeFun // // Created by WengHengcong on 2017/4/14. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit protocol PersonCardViewActionProtocol: class { func userLoginAction() func editMyProfileAction() func viewMyReposAction() func viewMyFollowerAction() func viewMyFollowingAction() } class CPPersonCardView: UIButton { var avatarImgView: UIImageView = UIImageView() var nameLabel: UILabel = UILabel() var bioLabel: UILabel = UILabel() // var blogButton:UIButton = UIButton() var loginButton: UIButton = UIButton() var editButton: UIButton = UIButton() var reposButton: UIButton = UIButton() var followerButton: UIButton = UIButton() var followingButton: UIButton = UIButton() var user: ObjUser? { didSet { pc_fillData() } } weak var delegate: PersonCardViewActionProtocol? override init(frame: CGRect) { super.init(frame: frame) pc_customeView() } convenience init() { self.init(frame: CGRect.zero) } convenience init(obj: ObjUser) { self.init(frame: CGRect.zero) self.user = obj } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func pc_customeView() { self.addSubview(avatarImgView) self.addSubview(nameLabel) self.addSubview(bioLabel) // self.addSubview(blogButton) self.addSubview(loginButton) self.addSubview(editButton) self.addSubview(reposButton) self.addSubview(followerButton) self.addSubview(followingButton) avatarImgView.radius = 35 nameLabel.textColor = UIColor.black bioLabel.textColor = UIColor.bfLabelSubtitleTextColor bioLabel.font = UIFont.bfSystemFont(ofSize: 13.0) // blogButton.setTitleColor(UIColor.blue, for: .normal) // blogButton.setTitleColor(UIColor.blue, for: .highlighted) // blogButton.contentHorizontalAlignment = .left // blogButton.titleLabel?.font = UIFont.bfSystemFont(ofSize: 13.0) // editButton.backgroundColor = UIColor.brown editButton.addBorderAround(UIColor.bfRedColor, radius: 2.0, width: 1.0) editButton.setTitle("Edit".localized, for: .normal) editButton.setTitle("Edit".localized, for: .highlighted) editButton.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) editButton.setTitleColor(UIColor.bfRedColor, for: .normal) editButton.setTitleColor(UIColor.bfRedColor, for: .highlighted) editButton.addTarget(self, action: #selector(pc_eidtAction), for: .touchUpInside) loginButton.addBorderAround(UIColor.bfRedColor, radius: 1.0, width: 1.0) loginButton.setTitle("Sign in".localized, for: .normal) loginButton.setTitle("Sign in".localized, for: .highlighted) loginButton.titleLabel?.font = UIFont.bfSystemFont(ofSize: 16.0) loginButton.setTitleColor(UIColor.bfRedColor, for: .normal) loginButton.setTitleColor(UIColor.bfRedColor, for: .highlighted) loginButton.addTarget(self, action: #selector(pc_loginAction), for: .touchUpInside) let loginW: CGFloat = 200 let loginX = UIView.xSpace(width: loginW) let loginY: CGFloat = 40 let loginH: CGFloat = 40 loginButton.frame = CGRect(x: loginX, y: loginY, w: loginW, h: loginH) let avaX: CGFloat = 20 let avaW: CGFloat = 70 let avaY: CGFloat = 20 avatarImgView.frame = CGRect(x: avaX, y: avaY, w: avaW, h: avaW) // let editRightSpace: CGFloat = 10 let editW: CGFloat = 50 let editX = ScreenSize.width-editW-editRightSpace editButton.frame = CGRect(x: editX, y: avaY+15, w: editW, h: 25) let nameX = avatarImgView.right + 10 let nameW = ScreenSize.width-nameX-editRightSpace-editW nameLabel.frame = CGRect(x: nameX, y: avaY, w: nameW, h: 30) bioLabel.frame = CGRect(x: nameX, y: nameLabel.bottom, w: nameW, h: 30) // let blogW:CGFloat = ScreenSize.width-avaX-editRightSpace // blogButton.frame = CGRect(x: avaX, y: avatarImgView.bottom+10, w: blogW, h: 30) let btns = [reposButton, followerButton, followingButton] let btnW = ScreenSize.width/3.0 let btnY = avatarImgView.bottom + 15 let btnH: CGFloat = 37 for (index, btn) in btns.enumerated() { let x = CGFloat(index) * btnW btn.titleLabel?.lineBreakMode = .byCharWrapping btn.titleLabel?.textAlignment = .center btn.addBorderAroundInOnePixel(UIColor.bfLineBackgroundColor) btn.setTitleColor(UIColor.bfLabelSubtitleTextColor, for: .normal) btn.setTitleColor(UIColor.bfLabelSubtitleTextColor, for: .highlighted) btn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 13.0) btn.frame = CGRect(x: x, y: btnY, w: btnW, h: btnH) } reposButton.addTarget(self, action: #selector(pc_reposAction(_:)), for: .touchUpInside) followerButton.addTarget(self, action: #selector(pc_followAction(_:)), for: .touchUpInside) followingButton.addTarget(self, action: #selector(pc_followingAction(_:)), for: .touchUpInside) } func pc_fillData() { let isLoingin: Bool = UserManager.shared.isLogin avatarImgView.isHidden = !isLoingin nameLabel.isHidden = !isLoingin bioLabel.isHidden = !isLoingin // blogButton.isHidden = !isLoingin editButton.isHidden = !isLoingin loginButton.isHidden = isLoingin if let avatarUrl = user?.avatar_url { avatarImgView.kf.setImage(with: URL(string: avatarUrl)!) } if let name = user?.name { nameLabel.text = name } else { if let userLogin = UserManager.shared.login { nameLabel.text = userLogin } else { if let email = user?.email { nameLabel.text = email } } } if let bio = user?.bio { bioLabel.text = bio } // if let blog = user?.blog { // let blogTitle = "Blog:"+blog // blogButton.setTitle(blogTitle, for: .normal) // blogButton.setTitle(blogTitle, for: .highlighted) // } let blackAttribute = [NSAttributedString.Key.foregroundColor: UIColor.iOS11Black] // var repos = "0 \n"+"Repositories".localized if let privateReposCount = user?.total_private_repos { if let publicReposCount = user?.public_repos { let reposCount = privateReposCount + publicReposCount repos = String("\(reposCount) \n") + "Repositories".localized } else { repos = String("\(privateReposCount) \n") + "Repositories".localized } } else { if let publicReposCount = user?.public_repos { repos = String("\(publicReposCount) \n") + "Repositories".localized } } let repoAttribute = NSMutableAttributedString(string: repos, attributes: blackAttribute) repoAttribute.setSubstringColor("Repositories".localized, color: UIColor.bfLabelSubtitleTextColor) reposButton.setAttributedTitle(repoAttribute, for: .normal) reposButton.setAttributedTitle(repoAttribute, for: .highlighted) var followers = "0 \n"+"Followers".localized if let followerCount = user?.followers { followers = String("\(followerCount) \n") + "Followers".localized } let followerAttribute = NSMutableAttributedString(string: followers, attributes: blackAttribute) followerAttribute.setSubstringColor("Followers".localized, color: UIColor.bfLabelSubtitleTextColor) followerButton.setAttributedTitle(followerAttribute, for: .normal) followerButton.setAttributedTitle(followerAttribute, for: .highlighted) // var following = "0 \n"+"Following".localized if let followingCount = user?.following { following = String("\(followingCount) \n") + "Following".localized } let followingAttribute = NSMutableAttributedString(string: following, attributes: blackAttribute) followingAttribute.setSubstringColor("Following".localized, color: UIColor.bfLabelSubtitleTextColor) followingButton.setAttributedTitle(followingAttribute, for: .normal) followingButton.setAttributedTitle(followingAttribute, for: .highlighted) } } extension CPPersonCardView { @objc func pc_loginAction() { DispatchQueue.main.async { self.delegate?.userLoginAction() } } @objc func pc_eidtAction() { DispatchQueue.main.async { self.delegate?.editMyProfileAction() } } @objc func pc_followAction(_ sender: UITapGestureRecognizer) { if let followerCount = user?.followers { if followerCount == 0 || !UserManager.shared.isLogin { return } } DispatchQueue.main.async { self.delegate?.viewMyFollowerAction() } } @objc func pc_reposAction(_ sender: UITapGestureRecognizer) { if let reposCount = user?.public_repos { if reposCount == 0 || !UserManager.shared.isLogin { return } } DispatchQueue.main.async { self.delegate?.viewMyReposAction() } } @objc func pc_followingAction(_ sender: UITapGestureRecognizer) { if let followingCount = user?.following { if followingCount == 0 || !UserManager.shared.isLogin { return } } if self.delegate != nil { self.delegate!.viewMyFollowingAction() } } } ================================================ FILE: BeeFun/BeeFun/View/Profile/en.lproj/BFProfile.plist ================================================ type image id feedback key Feedback icon set_feedback disclosure id tags key Tags icon set_tag disclosure type image id sync key Sync icon set_sync disclosure type image ================================================ FILE: BeeFun/BeeFun/View/Profile/zh-Hans.lproj/BFProfile.plist ================================================ type image id feedback key 反馈 icon set_feedback disclosure id tags key 标签 icon set_tag disclosure type image id sync key 同步 icon set_sync disclosure type image ================================================ FILE: BeeFun/BeeFun/View/Repository/BFRepoDetailController+Data.swift ================================================ // // BFRepoDetailController+Data.swift // BeeFun // // Created by WengHengcong on 28/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper import Result import Moya import SwiftDate extension BFRepoDetailController { override func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } override func request() { super.request() rvc_loadAllRequset() } // MARK: - Info Models func rvc_loadReposCellModels() { cellModels.removeAll() let homeModel = JSCellModel(["type": "image", "id": "homepage", "key": "Homepage".localized, "icon": "repos_homepage", "disclosure": "true"]) homeModel.didSelectClosure = { (tableView, indexPath, model) in JumpManager.shared.jumpWebView(url: self.repoModel?.html_url) } cellModels.insert(homeModel, at: 0) let uname = repoModel!.owner!.login! let userModel = JSCellModel(["type": "image", "id": "owner", "key": "Owner".localized, "icon": "repos_me", "value": uname, "disclosure": "true"]) userModel.didSelectClosure = { (tableView, indexPath, model) in if let owner = self.repoModel?.owner { JumpManager.shared.jumpUserDetailView(user: owner) } } cellModels.insert(userModel, at: 1) if from == .star { let tags = repoModel?.star_tags?.joined(separator: ",") ?? "" let tagsModel = JSCellModel(["type": "image", "id": "tags", "key": "Tags".localized, "icon": "set_tag_black", "value": tags, "disclosure": "true"]) tagsModel.didSelectClosure = { (tableView, indexPath, model) in let vc = BFUpdateTagsController() vc.hidesBottomBarWhenPushed = true vc.repoModel = self.repoModel vc.oriStatTags = self.repoModel?.star_tags self.navigationController?.pushViewController(vc, animated: true) } cellModels.insert(tagsModel, at: 2) } } // MARK: - request func rvc_getReopsRequest() { view.backgroundColor = UIColor.white tableView.isHidden = true if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.userSomeRepo(owner:owner, repo:repoName) ) { (result) -> Void in hud.hide(animated: true) self.rvc_handleReposResponse(result: result) } } } func rvc_handleReposResponse( result: Result ) { var message = kNoDataFoundTip switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.ok.rawValue { do { if let result: ObjRepos = Mapper().map(JSONObject: try response.mapJSON() ) { result.star_tags = repoModel?.star_tags result.star_lists = repoModel?.star_lists repoModel = result rdc_updateViewContent() } else { } } catch { JSMBHUDBridge.showError(message, view: view) } } else { JSMBHUDBridge.showError(message, view: view) } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: view) } } // MARK: - 各种网络接口 func rvc_checkWatchedRequset() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.checkWatched(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip switch result { case let .success(response): self.repoModel?.watched = (response.statusCode == BFStatusCode.ok.rawValue) self.reposPoseterV.watched = self.repoModel?.watched case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_checkStarredRqeuset() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.checkStarred(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip print(result) switch result { case let .success(response): self.repoModel?.starred = (response.statusCode == BFStatusCode.noContent.rawValue) self.reposPoseterV.stared = self.repoModel?.starred case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_watchRequest() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.watchingRepo(owner:owner, repo:repoName, subscribed:"true", ignored:"false") ) { (result) -> Void in var message = kNoDataFoundTip print(result) switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.repoModel?.watched = true self.reposPoseterV.watched = self.repoModel?.watched JSMBHUDBridge.showSuccess("Watch Success".localized, view: self.view) } else { } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_unwatchRequest() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.unWatchingRepo(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip print(result) switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.repoModel?.watched = false self.reposPoseterV.watched = self.repoModel?.watched JSMBHUDBridge.showSuccess("Unwatch Success".localized, view: self.view) } else { } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_starRequest() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.starRepo(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip print(result) switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.repoModel?.starred = true self.reposPoseterV.stared = self.repoModel?.starred JSMBHUDBridge.showSuccess("Star Success".localized, view: self.view) //插入 if let repo = self.repoModel { self.rvc_addRepoWhenStarRepo(objRepo: repo) } } else { } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_unstarRequest() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.unstarRepo(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip print(result) switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.repoModel?.starred = false self.reposPoseterV.stared = self.repoModel?.starred JSMBHUDBridge.showSuccess("Unstar Success".localized, view: self.view) if let repoid = self.repoModel?.id { self.rvc_deleteRepoWhenUnStarRepo(repoId: repoid) } } else { } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func rvc_forkRequest() { if !UserManager.shared.isLogin { return } if let owner = repoModel?.owner?.login, let repoName = repoModel?.name { Provider.sharedProvider.request(.createFork(owner:owner, repo:repoName) ) { (result) -> Void in var message = kNoDataFoundTip switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.accepted.rawValue { JSMBHUDBridge.showSuccess("Fork Success".localized, view: self.view) } else { } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } // MARK: - BeeFun DB 操作 func rvc_deleteRepoWhenUnStarRepo(repoId: Int) { BeeFunProvider.sharedProvider.request(BeeFunAPI.delRepo(repoid: repoId)) { (result) in switch result { case let .success(response): do { if let tagResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum { if code == BFStatusCode.bfOk { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.didUnStarRepo, object: nil) } } else { } } } catch { } case .failure: break } } } func rvc_addRepoWhenStarRepo(objRepo: ObjRepos) { let now = DateInRegion() objRepo.starred_at = now.toISO() BeeFunProvider.sharedProvider.request(BeeFunAPI.addRepo(repo: objRepo)) { (result) in switch result { case let .success(response): do { if let tagResponse: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) { if let code = tagResponse.codeEnum { if code == BFStatusCode.bfOk { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.didStarRepo, object: nil) } } else { } } } catch { } case .failure: break } } } } ================================================ FILE: BeeFun/BeeFun/View/Repository/BFRepoDetailController.swift ================================================ // // BFRepoDetailController.swift // BeeFun // // Created by WengHengcong on 3/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh import ObjectMapper import Kingfisher import Result public enum CPReposActionType: String { case watch case star case fork } enum ReposDetailFrom { case search case star case other } class BFRepoDetailController: BFBaseViewController { var reposPoseterV: CPReposPosterView = CPReposPosterView(frame: CGRect.zero) var reposInfoV: CPReposInfoView = CPReposInfoView(frame: CGRect.zero) var repoModel: ObjRepos? var cellModels: [JSCellModel] = [] var user: ObjUser? var actionType: CPReposActionType = .watch var from: ReposDetailFrom = .other // MARK: - view cycle override func viewDidLoad() { title = repoModel!.name! super.viewDidLoad() rvc_customView() rdc_registerNotification() rvc_loadAllRequset() } func rdc_registerNotification() { NotificationCenter.default.addObserver(self, selector: #selector(rdc_updateTag(noti:)), name: NSNotification.Name.BeeFun.RepoUpdateTag, object: nil) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) rvc_loadAllRequset() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } // MARK: - view func rvc_customView() { reposPoseterV.isHidden = true reposInfoV.isHidden = true tableView.isHidden = true view.addSubview(reposPoseterV) view.addSubview(reposInfoV) view.addSubview(tableView) rightItemImage = UIImage(named: "nav_share") rightItemSelImage = UIImage(named: "nav_share") rightItem?.isHidden = !ShareManager.shared.enable navigationController?.setNavigationBarHidden(false, animated: false) //Layout //designBy4_7Inch(80+30)-> let dynPostH = designBy4_7Inch(110) + 39 reposPoseterV.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: dynPostH) let infoViewT = reposPoseterV.bottom+10 let dynInfoH = designBy4_7Inch(90) reposInfoV.frame = CGRect(x: 0, y: infoViewT, width: ScreenSize.width, height: dynInfoH) let tabViewT = reposInfoV.bottom+10 let tabViewH = ScreenSize.height-tabViewT tableView.frame = CGRect(x: 0, y: tabViewT, width: ScreenSize.width, height: tabViewH) user = UserManager.shared.user reposPoseterV.reposActionDelegate = self refreshHidden = .all automaticallyAdjustsScrollViewInsets = false } // MARK: - action override func headerRefresh() { super.headerRefresh() } override func footerRefresh() { super.footerRefresh() } // 在页面update后需要更新 @objc func rdc_updateTag(noti: NSNotification) { if noti.userInfo != nil { if let updatedTags: [String] = noti.userInfo!["star_tags"] as? [String] { repoModel?.star_tags = updatedTags } } rdc_updateViewContent() } func rdc_updateViewContent() { if let objRepo = repoModel { view.backgroundColor = UIColor.bfViewBackgroundColor reposPoseterV.isHidden = false reposInfoV.isHidden = false tableView.isHidden = false reposPoseterV.repo = objRepo reposInfoV.repo = objRepo if objRepo.html_url != nil { rvc_loadReposCellModels() tableView.reloadData() } } } override func reconnect() { super.reconnect() rvc_loadAllRequset() } func rvc_loadAllRequset() { rvc_getReopsRequest() rvc_checkWatchedRequset() rvc_checkStarredRqeuset() } /// 导航栏左边按钮 override func leftItemAction(_ sender: UIButton?) { _ = navigationController?.popViewController(animated: true) } override func rightItemAction(_ sender: UIButton?) { let shareContent: ShareContent = ShareContent() shareContent.title = repoModel?.name shareContent.contentType = SSDKContentType.webPage shareContent.source = .repository shareContent.url = repoModel?.html_url ?? "" if let repoDescription = repoModel?.cdescription { shareContent.content = "It's A Wonderful Repository from github! Hurry UP!".localized+": \((repoModel?.name)!)\n \(repoDescription) "+"\(shareContent.url!)\n" + "from BeeFun App".localized+" "+"Download Here".localized + SocialAppStore } else { shareContent.content = "It's A Wonderful Repository from github! Hurry UP!".localized+": \((repoModel?.name)!)\n" + "\(shareContent.url!)\n" + "from BeeFun App".localized+" "+"Download Here".localized + SocialAppStore } if let urlStr = repoModel?.owner?.avatar_url { shareContent.image = urlStr as AnyObject? ShareManager.shared.share(content: shareContent) } else { shareContent.image = UIImage(named: "app_logo_90") ShareManager.shared.share(content: shareContent) } } } extension BFRepoDetailController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return cellModels.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellModel = cellModels[row] var cell = tableView.dequeueReusableCell(withIdentifier: "BFUserTypeThirdCellIdentifier") as? JSImageCell if cell == nil { cell = JSCellFactory.cell(type: cellModel.type!) as? JSImageCell } cell?.model = cellModel cell?.bothEndsLine(row, all: cellModels.count) return cell! } } extension BFRepoDetailController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row let cellM = cellModels[row] if let cellDidSeleted = cellM.didSelectClosure { cellDidSeleted(tableView, indexPath, cellM) } } } extension BFRepoDetailController:ReposActionProtocol { func watchReposAction() { actionType = .watch showAlertView() } func starReposAction() { actionType = .star showAlertView() } func forkReposAction() { actionType = .fork showAlertView() } func showAlertView() { var title = "" // var clickSure: ((UIAlertAction) -> Void) = { // (UIAlertAction)->Void in // } switch actionType { case .watch: if repoModel!.watched! { title = "Unwatch?".localized } else { title = "Watch?".localized } case .star: if repoModel!.starred! { //移除 title = "Unstar?".localized } else { title = "Star?".localized // message = kStaringTip } case .fork: title = "Fork?".localized } let alertController = UIAlertController(title: title, message:nil, preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel".localized, style: .cancel) { (_) in // ... } alertController.addAction(cancelAction) let repoName = repoModel?.name ?? "Unknown Repos" let user = UserManager.shared.login ?? "Unknown User" let OKAction = UIAlertAction(title: "Sure".localized, style: .default) { (_) in switch self.actionType { case .watch: if self.repoModel!.watched! { self.rvc_unwatchRequest() AnswerManager.logContentView(name: "UnWatch", type: UserActionType.unwatch.rawValue, id: repoName, attributes: ["user": user, "repos": repoName]) } else { self.rvc_watchRequest() AnswerManager.logContentView(name: "Watch", type: UserActionType.watch.rawValue, id: repoName, attributes: ["user": user, "repos": repoName]) } case .star: if self.repoModel!.starred! { self.rvc_unstarRequest() AnswerManager.logContentView(name: "UnStar", type: UserActionType.unstar.rawValue, id: repoName, attributes: ["user": user, "repos": repoName]) } else { self.rvc_starRequest() AnswerManager.logContentView(name: "Star", type: UserActionType.star.rawValue, id: repoName, attributes: ["user": user, "repos": repoName]) } case .fork: self.rvc_forkRequest() AnswerManager.logContentView(name: "Fork", type: UserActionType.fork.rawValue, id: repoName, attributes: ["user": user, "repos": repoName]) } // rvc_updateViewContent() } alertController.addAction(OKAction) present(alertController, animated: true) { // ... } } } ================================================ FILE: BeeFun/BeeFun/View/Repository/BFRepoListController.swift ================================================ // // BFRepoListController.swift // BeeFun // // Created by wenghengcong on 16/1/30. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh class BFRepoListController: BFBaseViewController { //incoming var var dic: [String: String]? var username: String? //用户login,必须有 var viewType: String? //有myrepositories,就是用户创建维护仓库,另外,forked表示,fork的仓库 var reposData: [ObjRepos] = [] var reposPageVal = 1 var reposPerpage = 15 var typeVal: String = "all" var sortVal: String = "created" var directionVal: String = "desc" override func viewDidLoad() { self.title = "Repositories".localized super.viewDidLoad() rvc_addNaviBarButtonItem() rvc_setupTableView() rvc_selectDataSource() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func rvc_addNaviBarButtonItem() { /* let btnName = UIButton() btnName.setImage(UIImage(named: "bubble_consulting_chat-512"), forState: .Normal) btnName.frame = CGRectMake(0, 0, 30, 30) btnName.addTarget(self, action: Selector("tvc_rightButtonTouch"), forControlEvents: .TouchUpInside) //.... Set Right/Left Bar Button item let rightBarButton = UIBarButtonItem() rightBarButton.customView = btnName self.navigationItem.rightBarButtonItem = rightBarButton */ } func rvc_rightButtonTouch() { } func rvc_setupTableView() { self.view.addSubview(tableView) self.tableView.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: ScreenSize.height-uiTopBarHeight) self.automaticallyAdjustsScrollViewInsets = false } // 顶部刷新 override func headerRefresh() { super.headerRefresh() reposPageVal = 1 rvc_selectDataSource() } // 底部刷新 override func footerRefresh() { super.footerRefresh() reposPageVal += 1 rvc_selectDataSource() } func rvc_updateViewContent() { self.tableView.reloadData() } // MARK: - request for repos override func reconnect() { super.reconnect() rvc_selectDataSource() } func rvc_selectDataSource() { if self.viewType == "myrepositories" { rvc_getMyReposRequest() } else if self.viewType == "forked" { rvc_getForkedReposRequst() } else { rvc_getMyReposRequest() } } func rvc_getMyReposRequest() { if username == nil { return } let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.userRepos(username: username! ,page:self.reposPageVal, perpage:self.reposPerpage, type:self.typeVal, sort:self.sortVal, direction:self.directionVal ) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { let repos: [ObjRepos] = try response.mapArray(ObjRepos.self) if self.reposPageVal == 1 { self.reposData.removeAll() self.reposData = repos } else { self.reposData += repos } self.rvc_updateViewContent() } catch { } case .failure: break } } } func rvc_getForkedReposRequst() { } } extension BFRepoListController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.reposData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row var cellId = "" if self.viewType == "myrepositories" { cellId = "BFRepositoryTypeSecCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeSecCell if cell == nil { cell = (BFRepositoryTypeSecCell.cellFromNibNamed("BFRepositoryTypeSecCell") as? BFRepositoryTypeSecCell) } cell?.setBothEndsLines(row, all:reposData.count) let repos = self.reposData[row] cell!.objRepos = repos return cell! } cellId = "BFRepositoryTypeThirdCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeThirdCell if cell == nil { cell = (BFRepositoryTypeThirdCell.cellFromNibNamed("BFRepositoryTypeThirdCell") as? BFRepositoryTypeThirdCell) } cell?.setBothEndsLines(row, all: reposData.count) let repos = self.reposData[row] cell!.objRepos = repos return cell! } } extension BFRepoListController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 85 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let repos = self.reposData[indexPath.row] JumpManager.shared.jumpReposDetailView(repos: repos, from: .other) } } ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeFourCell.swift ================================================ // // BFRepositoryTypeFourCell.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BFRepositoryTypeFourCell: BFBaseCell { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var starImgV: UIImageView! @IBOutlet weak var starNumLabel: UILabel! @IBOutlet weak var forkImgV: UIImageView! @IBOutlet weak var forkNumLabel: UILabel! @IBOutlet weak var langLabel: UILabel! @IBOutlet weak var trendStarLabel: UILabel! @IBOutlet weak var starBtn: UIButton! @IBOutlet weak var descRight: NSLayoutConstraint! @IBOutlet weak var nameRight: NSLayoutConstraint! var objRepos: BFGithubTrengingModel? { didSet { if let name = objRepos!.repo_name { nameLabel.text = name } descLabel.text = objRepos!.repo_desc if let starCount = objRepos!.star_num { starNumLabel.text = "\(starCount)" } else { starNumLabel.text = "0" } if let forkNum = objRepos!.fork_num { forkNumLabel.text = "\(forkNum)" } else { forkNumLabel.text = "0" } if let lan = objRepos!.language { langLabel.text = "\(lan)" } else { langLabel.text = "Unknown".localized } if let trend = objRepos?.up_star_num { trendStarLabel.text = "\(trend)" } else { trendStarLabel.text = "" } } } override func awakeFromNib() { super.awakeFromNib() // Initialization code src_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func src_customView() { // starBtn.isHidden = !UserManager.shared.isLogin starBtn.isHidden = true starBtn.backgroundColor = UIColor.white starBtn.addBorderAround(UIColor.bfRedColor, radius: 2.0, width: 1.0) starBtn.setTitle("Star".localized, for: .normal) starBtn.setTitle("Star".localized, for: .highlighted) starBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) starBtn.setTitleColor(UIColor.bfRedColor, for: .normal) starBtn.setTitleColor(UIColor.bfRedColor, for: .highlighted) starBtn.addTarget(self, action: #selector(starReposAction), for: .touchUpInside) nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.largeSizeSystemFont() descLabel.textColor = UIColor.bfLabelSubtitleTextColor descLabel.font = UIFont.smallSizeSystemFont() descLabel.numberOfLines = 0 starNumLabel.textColor = UIColor.bfLabelSubtitleTextColor starNumLabel.font = UIFont.smallSizeSystemFont() starNumLabel.adjustFontSizeToFitWidth(minScale: 0.5) forkNumLabel.textColor = UIColor.bfLabelSubtitleTextColor forkNumLabel.font = UIFont.smallSizeSystemFont() forkNumLabel.adjustFontSizeToFitWidth(minScale: 0.5) langLabel.textColor = UIColor.bfLabelSubtitleTextColor langLabel.textAlignment = .left langLabel.font = UIFont.smallSizeSystemFont() langLabel.adjustFontSizeToFitWidth(minScale: 0.5) trendStarLabel.textColor = UIColor.bfLabelSubtitleTextColor trendStarLabel.font = UIFont.smallSizeSystemFont() trendStarLabel.adjustFontSizeToFitWidth(minScale: 0.5) setNeedsDisplay() } override func layoutSubviews() { nameRight.constant = -starBtn.width descRight.constant = -starBtn.width } @objc func starReposAction() { if let login = objRepos?.login, let repoName = objRepos?.repo_name { Provider.sharedProvider.request(.starRepo(owner:login, repo:repoName) ) { (result) -> Void in switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { //Star成功 } else { } case .failure: break } } } } } ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeFourCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeOneCell.swift ================================================ // // BFRepositoryTypeOneCell.swift // BeeFun // // Created by WengHengcong on 16/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit @IBDesignable /// 只用语Star项目中展示,会有star tag的显示 /// 无语言显示 class BFRepositoryTypeOneCell: BFBaseCell { @IBOutlet weak var logoImgV: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var starImgV: UIImageView! @IBOutlet weak var starNumLabel: UILabel! @IBOutlet weak var forkImgV: UIImageView! @IBOutlet weak var forkNumLabel: UILabel! @IBInspectable var titleColor: UIColor? = UIColor.iOS11Black { didSet { nameLabel?.textColor = titleColor } } @IBInspectable var subTitleColor: UIColor? = UIColor.bfLabelSubtitleTextColor { didSet { timeLabel?.textColor = subTitleColor starNumLabel?.textColor = subTitleColor forkNumLabel?.textColor = subTitleColor descLabel?.textColor = subTitleColor } } var objRepos: ObjRepos? { didSet { src_fillDataToUI() } } override func awakeFromNib() { super.awakeFromNib() // Initialization code src_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func src_customView() { logoImgV.layer.cornerRadius = logoImgV.width/2 logoImgV.layer.masksToBounds = true nameLabel.font = UIFont.largeSizeSystemFont() descLabel.font = UIFont.middleSizeSystemFont() timeLabel.font = UIFont.smallSizeSystemFont() timeLabel.adjustFontSizeToFitWidth(minScale: 0.5) starNumLabel.font = UIFont.smallSizeSystemFont() starNumLabel.adjustFontSizeToFitWidth(minScale: 0.5) forkNumLabel.font = UIFont.smallSizeSystemFont() forkNumLabel.adjustFontSizeToFitWidth(minScale: 0.5) } func src_fillDataToUI() { if let avatarUrl = objRepos?.owner?.avatar_url { if let url = URL(string: avatarUrl) { logoImgV.kf.setImage(with: url) } } if let name = objRepos!.name { nameLabel.text = name } if let desc = objRepos?.cdescription { descLabel.text = desc } if let push_at = objRepos?.starred_at { timeLabel.text = BFTimeHelper.shared.readableTime(rare: push_at, prefix: nil) } else if let showcaseUpdate = objRepos?.trending_showcase_update_text { timeLabel.text = showcaseUpdate } if let starCount = objRepos?.stargazers_count { starNumLabel.text = "\(starCount)" } else if let trend_star = objRepos?.trending_star_text { starNumLabel.text = trend_star } else { starNumLabel.text = "0" } if let forkNum = objRepos!.forks_count { forkNumLabel.text = "\(forkNum)" } else if let trend_fork = objRepos?.trending_fork_text { forkNumLabel.text = trend_fork } else { forkNumLabel.text = "0" } if let allTags = objRepos?.star_tags { var allBtns: [UIButton] = [] for (index, tag) in allTags.enumerated() { let tagB = UIButton() tagB.tag = index tagB.setTitle(tag, for: .normal) tagB.setTitleColor(UIColor.black, for: .normal) tagB.setTitleColor(UIColor.bfRedColor, for: .selected) tagB.titleLabel?.font = UIFont.bfSystemFont(ofSize: 12.0) tagB.radius = 10.0 tagB.borderWidth = 1.0/UIScreen.main.scale tagB.tag = index //按钮不可点击 tagB.isUserInteractionEnabled = false allBtns.append(tagB) self.contentView.addSubview(tagB) } var lastF = CGRect.zero let btnY: CGFloat = forkNumLabel.y var btnX = forkNumLabel.x+forkNumLabel.width+10 /// 按钮内部两边的间距宽度 let btnInsideMargin: CGFloat = 15 let btnOutsideMargin: CGFloat = 3.0 let lineH: CGFloat = 30 /// 按钮的高度 let btnH: CGFloat = 20 var btnW: CGFloat = 0 for (index, btn) in allBtns.enumerated() { if let tagsTitle = btn.currentTitle { btnW = tagsTitle.width(with: lineH, font: btn.titleLabel!.font) + btnInsideMargin } if index == 0 { btnX = ScreenSize.width-btnW-10 } else { lastF = allBtns[index-1].frame btnX = lastF.x - btnOutsideMargin - btnW } if btnX >= forkNumLabel.x+15 { let nowF = CGRect(x: btnX, y: btnY, w: btnW, h: btnH) btn.frame = nowF } } } } } ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeOneCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeSecCell.swift ================================================ // // BFRepositoryTypeFourCell.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit /// 用语Profile中我的项目 /// 有“语言”显示 class BFRepositoryTypeSecCell: BFBaseCell { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var starImgV: UIImageView! @IBOutlet weak var starNumLabel: UILabel! @IBOutlet weak var forkImgV: UIImageView! @IBOutlet weak var forkNumLabel: UILabel! @IBOutlet weak var langLabel: UILabel! var objRepos: ObjRepos? { didSet { nameLabel.text = objRepos!.name! descLabel.text = objRepos!.cdescription timeLabel.text = BFTimeHelper.shared.readableTime(rare: objRepos!.updated_at, prefix: nil) starNumLabel.text = "\(objRepos!.stargazers_count!)" forkNumLabel.text = "\(objRepos!.forks_count!)" if let lan = objRepos!.language { langLabel.text = "\(lan)" } } } override func awakeFromNib() { super.awakeFromNib() // Initialization code src_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func src_customView() { nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.largeSizeSystemFont() descLabel.textColor = UIColor.bfLabelSubtitleTextColor descLabel.font = UIFont.middleSizeSystemFont() timeLabel.textColor = UIColor.bfLabelSubtitleTextColor timeLabel.font = UIFont.smallSizeSystemFont() starNumLabel.textColor = UIColor.bfLabelSubtitleTextColor starNumLabel.font = UIFont.smallSizeSystemFont() forkNumLabel.textColor = UIColor.bfLabelSubtitleTextColor forkNumLabel.font = UIFont.smallSizeSystemFont() langLabel.textColor = UIColor.bfLabelSubtitleTextColor langLabel.font = UIFont.smallSizeSystemFont() } } ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeSecCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeThirdCell.swift ================================================ // // BFRepositoryTypeThirdCell.swift // BeeFun // // Created by wenghengcong on 16/1/30. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit /// 用于在showcase中的项目展示 /// 有图片,有语言显示 class BFRepositoryTypeThirdCell: BFBaseCell { @IBOutlet weak var logoImgV: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var starImgV: UIImageView! @IBOutlet weak var starNumLabel: UILabel! @IBOutlet weak var forkImgV: UIImageView! @IBOutlet weak var forkNumLabel: UILabel! @IBOutlet weak var langLabel: UILabel! var objRepos: ObjRepos? { didSet { src_fillDataToUI() } } override func awakeFromNib() { super.awakeFromNib() // Initialization code src_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func src_customView() { logoImgV.layer.cornerRadius = logoImgV.width/2 logoImgV.layer.masksToBounds = true nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.largeSizeSystemFont() descLabel.textColor = UIColor.bfLabelSubtitleTextColor descLabel.font = UIFont.middleSizeSystemFont() timeLabel.textColor = UIColor.bfLabelSubtitleTextColor timeLabel.font = UIFont.smallSizeSystemFont() timeLabel.adjustFontSizeToFitWidth(minScale: 0.5) starNumLabel.textColor = UIColor.bfLabelSubtitleTextColor starNumLabel.font = UIFont.smallSizeSystemFont() starNumLabel.adjustFontSizeToFitWidth(minScale: 0.5) forkNumLabel.textColor = UIColor.bfLabelSubtitleTextColor forkNumLabel.font = UIFont.smallSizeSystemFont() timeLabel.adjustFontSizeToFitWidth(minScale: 0.5) langLabel.textColor = UIColor.bfLabelSubtitleTextColor langLabel.font = UIFont.smallSizeSystemFont() langLabel.adjustFontSizeToFitWidth(minScale: 0.5) } func src_fillDataToUI() { if let avatarUrl = objRepos?.owner?.avatar_url { if let url = URL(string: avatarUrl) { logoImgV.kf.setImage(with: url) } } if let name = objRepos!.name { nameLabel.text = name } if let desc = objRepos?.cdescription { descLabel.text = desc } if let push_at = objRepos?.pushed_at { timeLabel.text = BFTimeHelper.shared.readableTime(rare: push_at, prefix: nil) } else if let showcaseUpdate = objRepos?.trending_showcase_update_text { timeLabel.text = showcaseUpdate } if let starCount = objRepos?.stargazers_count { starNumLabel.text = "\(starCount)" } else if let trend_star = objRepos?.trending_star_text { starNumLabel.text = trend_star } else { starNumLabel.text = "0" } if let forkNum = objRepos!.forks_count { forkNumLabel.text = "\(forkNum)" } else if let trend_fork = objRepos?.trending_fork_text { forkNumLabel.text = trend_fork } else { forkNumLabel.text = "0" } if let lan = objRepos!.language { langLabel.text = "\(lan)" } else { langLabel.text = "Unknown".localized } } } ================================================ FILE: BeeFun/BeeFun/View/Repository/RepositoryCell/BFRepositoryTypeThirdCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Repository/View/CPReposInfoView.swift ================================================ // // CPReposInfoView.swift // BeeFun // // Created by WengHengcong on 3/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit /// Repos 底部的代码库的详细信息视图 class CPReposInfoView: UIView { var watchBtn: UIButton = UIButton() var starBtn: UIButton = UIButton() var forkBtn: UIButton = UIButton() var lanBtn: UIButton = UIButton() var privateBtn: UIButton = UIButton() var issueBtn: UIButton = UIButton() var filesizeBtn: UIButton = UIButton() var repo: ObjRepos? { didSet { riv_fillData() } } override init(frame: CGRect) { super.init(frame: frame) riv_customView() } convenience init(obj: ObjRepos) { self.init(frame:CGRect.zero) self.repo = obj } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } /// view func riv_customView() { self.addSubview(self.watchBtn) self.addSubview(self.starBtn) self.addSubview(self.forkBtn) self.addSubview(self.lanBtn) self.addSubview(self.privateBtn) self.addSubview(self.issueBtn) self.addSubview(self.filesizeBtn) self.backgroundColor = UIColor.white watchBtn.setImage(UIImage(named: "repos_watch"), for: UIControl.State()) starBtn.setImage(UIImage(named: "repos_star"), for: UIControl.State()) forkBtn.setImage(UIImage(named: "repos_fork"), for: UIControl.State()) lanBtn.setImage(UIImage(named: "repos_lan"), for: UIControl.State()) privateBtn.setImage(UIImage(named: "repos_unlock"), for: UIControl.State()) issueBtn.setImage(UIImage(named: "repos_issue"), for: UIControl.State()) filesizeBtn.setImage(UIImage(named: "repos_file"), for: UIControl.State()) let widthBy3Part = UIScreen.width/3 let widthBy2Part = UIScreen.width/2 let lineH = designBy4_7Inch(30.0) let imgEdgeInsets1 = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10) let borderWidth: CGFloat = 0.5 let btnArr1: [UIButton] = [watchBtn, starBtn, forkBtn] let line1Y: CGFloat = 0.0 for (index, btn) in btnArr1.enumerated() { let x = CGFloat(index) * widthBy3Part btn.frame = CGRect(x: x, y: line1Y, width: widthBy3Part, height: lineH) btn.imageView?.contentMode = .scaleAspectFit btn.imageEdgeInsets = imgEdgeInsets1 btn.layer.borderColor = UIColor.bfLineBackgroundColor.cgColor btn.layer.borderWidth = borderWidth btn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) btn.setTitleColor(UIColor.iOS11Black, for: UIControl.State()) } let imgEdgeInsets2 = UIEdgeInsets(top: 0, left: -40, bottom: 0, right: 10) let btnArr2: [UIButton] = [lanBtn, privateBtn, issueBtn, filesizeBtn] for (index, btn) in btnArr2.enumerated() { let x = CGFloat(index%2) * widthBy2Part let y = (index < 2) ? lineH : (2*lineH) btn.tag = index btn.frame = CGRect(x: x, y: y, width: widthBy2Part, height: lineH) btn.imageView?.contentMode = .scaleAspectFit btn.imageEdgeInsets = imgEdgeInsets2 btn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) btn.layer.borderColor = UIColor.bfLineBackgroundColor.cgColor btn.layer.borderWidth = borderWidth btn.setTitleColor(UIColor.iOS11Black, for: UIControl.State()) btn.addTarget(self, action:#selector(jumpWebView(sender:)), for: .touchUpInside) } } // MARK: - layout override func layoutSubviews() { super.layoutSubviews() } // MARK: - data func riv_fillData() { if let watchCount = repo?.subscribers_count { watchBtn.setTitle("\(watchCount)", for: UIControl.State()) } if let stargazersCount = repo?.stargazers_count { starBtn.setTitle("\(stargazersCount)", for: UIControl.State()) } if let forksCount = repo?.forks_count { forkBtn.setTitle("\(forksCount)", for: UIControl.State()) } if let lan = repo?.language { lanBtn.setTitle("\(lan)", for: UIControl.State()) } else { lanBtn.setTitle("Unknown".localized, for: UIControl.State()) } if let cprivate = repo?.cprivate { if cprivate { privateBtn.setTitle("Private".localized, for: UIControl.State()) privateBtn.setImage(UIImage(named: "repos_lock"), for: UIControl.State()) } else { privateBtn.setTitle("Public".localized, for: UIControl.State()) privateBtn.setImage(UIImage(named: "repos_unlock"), for: UIControl.State()) } } if let issueCount = repo?.open_issues_count { if issueCount <= 1 { issueBtn.setTitle("\(issueCount) issue", for: UIControl.State()) } else { issueBtn.setTitle("\(issueCount) issues", for: UIControl.State()) } } if let fileMB = repo?.size { let fileMB = String(format: "%.2f", ((Double)(fileMB)/1024.0) ) filesizeBtn.setTitle("\(fileMB) MB", for: UIControl.State()) } self.setNeedsLayout() } func riv_settingButtons() { } @objc func jumpWebView(sender: UIButton) { } } ================================================ FILE: BeeFun/BeeFun/View/Repository/View/CPReposPosterView.swift ================================================ // // CPReposPosterView.swift // BeeFun // // Created by WengHengcong on 3/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit protocol ReposActionProtocol: class { func watchReposAction() func starReposAction() func forkReposAction() } /// Repos 头部的代码库的主要信息视图 class CPReposPosterView: UIView { var imgV: UIImageView = UIImageView() var nameLabel: UILabel = UILabel() var descLabel: UILabel = UILabel() var timeLabel: UILabel = UILabel() var watchBtn: UIButton = UIButton() var starBtn: UIButton = UIButton() var forkBtn: UIButton = UIButton() weak var reposActionDelegate: ReposActionProtocol? var dynH: CGFloat = 0.0 var repo: ObjRepos? { didSet { rpv_fillData() } } var watched: Bool? { didSet { if watched! { watchBtn.setTitle("Unwatch".localized, for: UIControl.State()) watchBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10) } else { watchBtn.setTitle("Watch".localized, for: UIControl.State()) watchBtn.imageEdgeInsets = UIEdgeInsets(top: 0, left: -5, bottom: 0, right: 10) } } } var stared: Bool? { didSet { if stared! { starBtn.setTitle("Unstar".localized, for: UIControl.State()) } else { starBtn.setTitle("Star".localized, for: UIControl.State()) } } } // MARK: - Init /// Init /// /// - Parameter frame: <#frame description#> override init(frame: CGRect) { super.init(frame: frame) rpv_customView() } convenience init(obj: ObjRepos) { self.init(frame:CGRect.zero) self.repo = obj } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } // MARK: - View func rpv_customView() { self.addSubview(self.imgV) self.addSubview(self.nameLabel) self.addSubview(self.descLabel) self.addSubview(self.timeLabel) self.addSubview(self.watchBtn) self.addSubview(self.forkBtn) self.addSubview(self.starBtn) self.nameLabel.font = UIFont.bfSystemFont(ofSize: 20.0) self.descLabel.font = UIFont.bfSystemFont(ofSize: 13.0) self.timeLabel.font = UIFont.bfSystemFont(ofSize: 13.0) self.backgroundColor = UIColor.white nameLabel.textColor = UIColor.iOS11Black nameLabel.backgroundColor = UIColor.white descLabel.textColor = UIColor.bfLabelSubtitleTextColor descLabel.backgroundColor = UIColor.white descLabel.numberOfLines = 3 timeLabel.backgroundColor = UIColor.white timeLabel.textColor = UIColor.hex("#4876FF") watchBtn.setImage(UIImage(named: "octicon_watch_red_20"), for: UIControl.State()) watchBtn.setTitle("Watch".localized, for: UIControl.State()) watchBtn.addTarget(self, action: #selector(CPReposPosterView.rpv_watchAction), for: .touchUpInside) starBtn.setImage(UIImage(named: "octicon_star_red_20"), for: UIControl.State()) starBtn.setTitle("Star".localized, for: UIControl.State()) starBtn.addTarget(self, action: #selector(CPReposPosterView.rpv_starAction), for: .touchUpInside) forkBtn.setImage(UIImage(named: "octicon_fork_red_20"), for: UIControl.State()) forkBtn.setTitle("Fork".localized, for: UIControl.State()) forkBtn.addTarget(self, action: #selector(CPReposPosterView.rpv_forkAction), for: .touchUpInside) let margin: CGFloat = 10.0 let imgW = designBy4_7Inch(80) imgV.frame = CGRect(x: margin, y: margin+7.0, width: imgW, height: imgW) let nameL: CGFloat = imgV.right+10.0 let nameW: CGFloat = ScreenSize.width-nameL-margin nameLabel.frame = CGRect(x: nameL, y: 10.0, width: nameW, height: 24.0) let imgEdgeInsets = UIEdgeInsets(top: 0, left: -5, bottom: 0, right: 10) let cornerRadius: CGFloat = 3.0 let borderWidth: CGFloat = 0.5 let top: CGFloat = max(imgV.bottom, timeLabel.bottom)+14.0 let width = (ScreenSize.width-4*margin)/3 let height: CGFloat = designBy4_7Inch(30.0) let btnArr = [watchBtn, starBtn, forkBtn] for (index, btn) in btnArr.enumerated() { btn.imageView?.contentMode = .scaleAspectFit btn.imageEdgeInsets = imgEdgeInsets btn.layer.cornerRadius = cornerRadius btn.layer.masksToBounds = true btn.layer.borderColor = UIColor.bfRedColor.cgColor btn.layer.borderWidth = borderWidth btn.setTitleColor(UIColor.bfRedColor, for: UIControl.State()) btn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) let left = CGFloat(index) * (width+margin) + margin btn.frame = CGRect(x: left, y: top, width: width, height: height) } } override func layoutSubviews() { super.layoutSubviews() var descT = nameLabel.bottom+2.0 var descH = descLabel.requiredHeight(w:nameLabel.width) if descH > 47.0 { descH = 47.0 } if descH < 18 { descT = nameLabel.bottom + 12.0 } else if descH < 32 { descH = nameLabel.bottom + 8.0 } descLabel.frame = CGRect(x: nameLabel.left, y: descT, width:nameLabel.width, height: descH) let timeT = imgV.bottom-16 timeLabel.frame = CGRect(x: nameLabel.left, y: timeT, width: nameLabel.width, height: 21) } // MARK: - Data func rpv_fillData() { if let avatarUrl = repo?.owner?.avatar_url { imgV.kf.setImage(with: URL(string: avatarUrl)!) } if let username = repo!.name { nameLabel.text = username } if let cdescription = repo!.cdescription { descLabel.text = cdescription } if let created_at = repo!.created_at { timeLabel.text = BFTimeHelper.shared.readableTime(rare: created_at, prefix: "created at") } self.setNeedsLayout() } // MARK: - Action @objc func rpv_watchAction() { if self.reposActionDelegate != nil { self.reposActionDelegate!.watchReposAction() } } @objc func rpv_starAction() { if self.reposActionDelegate != nil { self.reposActionDelegate!.starReposAction() } } @objc func rpv_forkAction() { if self.reposActionDelegate != nil { self.reposActionDelegate!.forkReposAction() } } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseCode.swift ================================================ // // SEResponseCode.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class SEResponseCode: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjSearchCode]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseCommits.swift ================================================ // // SEResponseCommits.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class SEResponseCommits: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjCommit]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseIssues.swift ================================================ // // SEResponseIssues.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class SEResponseIssues: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjIssue]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseRepos.swift ================================================ // // ObjSearchReposResponse.swift // BeeFun // // Created by WengHengcong on 4/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper class SEResponseRepos: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjRepos]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseUsers.swift ================================================ // // ObjSearchUserResponse.swift // BeeFun // // Created by WengHengcong on 3/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import ObjectMapper /* { "total_count": 9680799, "incomplete_results": true, "items": [ { "login": "torvalds", "id": 1024025, "avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=3", "gravatar_id": "", "url": "https://api.github.com/users/torvalds", "html_url": "https://github.com/torvalds", "followers_url": "https://api.github.com/users/torvalds/followers", "following_url": "https://api.github.com/users/torvalds/following{/other_user}", "gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}", "starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/torvalds/subscriptions", "organizations_url": "https://api.github.com/users/torvalds/orgs", "repos_url": "https://api.github.com/users/torvalds/repos", "events_url": "https://api.github.com/users/torvalds/events{/privacy}", "received_events_url": "https://api.github.com/users/torvalds/received_events", "type": "User", "site_admin": false, "score": 1 }, { "login": "tj", "id": 25254, "avatar_url": "https://avatars.githubusercontent.com/u/25254?v=3", "gravatar_id": "", "url": "https://api.github.com/users/tj", "html_url": "https://github.com/tj", "followers_url": "https://api.github.com/users/tj/followers", "following_url": "https://api.github.com/users/tj/following{/other_user}", "gists_url": "https://api.github.com/users/tj/gists{/gist_id}", "starred_url": "https://api.github.com/users/tj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tj/subscriptions", "organizations_url": "https://api.github.com/users/tj/orgs", "repos_url": "https://api.github.com/users/tj/repos", "events_url": "https://api.github.com/users/tj/events{/privacy}", "received_events_url": "https://api.github.com/users/tj/received_events", "type": "User", "site_admin": false, "score": 1 } ] } */ class SEResponseUsers: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjUser]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/ResultResponse/SEResponseWikis.swift ================================================ // // SEResponseWikis.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class SEResponseWikis: NSObject, Mappable { var totalCount: Int? var incompleteResults: Bool? var items: [ObjCommit]? override init() { super.init() } required init?(map: Map) { } func mapping(map: Map) { // super.mapping(map) totalCount <- map["total_count"] incompleteResults <- map["incomplete_results"] items <- map["items"] } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchResultContentView.swift ================================================ // // SESearchResultContentView.swift // BeeFun // // Created by WengHengcong on 28/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper protocol SESearchResultContentDelegate: class { func contentViewDidScroll(_ conetView: SESearchResultContentView) func contentView(_ contentView: SESearchResultContentView, didSelectRowAt indexPath: IndexPath) } class SESearchResultContentView: UIView, UITableViewDelegate, UITableViewDataSource, MJRefreshManagerAction { var index: Int = 0 // MARK: - View var tableView: UITableView = UITableView() let refreshManager = MJRefreshManager() var reposData: SEResponseRepos = SEResponseRepos() var usersData: SEResponseUsers = SEResponseUsers() var issueData: SEResponseIssues = SEResponseIssues() var codeData: SEResponseCode = SEResponseCode() var commitData: SEResponseCommits = SEResponseCommits() var wikiData: SEResponseWikis = SEResponseWikis() var searchModel: SESearchBaseModel var forceRefresh: Bool = false weak var delegate: SESearchResultContentDelegate? override init(frame: CGRect) { self.searchModel = SESearchBaseModel() super.init(frame: frame) } convenience init(frame: CGRect, index: Int, searchModel: SESearchBaseModel) { self.init(frame: frame) self.index = index self.searchModel = searchModel setupTableView() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setupTableView() { tableView.frame = self.bounds tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none refreshManager.delegate = self tableView.mj_header = refreshManager.header() tableView.mj_footer = refreshManager.footer() tableView.backgroundColor = UIColor.bfViewBackgroundColor if #available(iOS 11, *) { tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 } self.addSubview(tableView) } // MARK: - Data /// 外部加载调用 func reloadNetworkData() { if forceRefresh { if searchModel.page == 1 { tableView.setContentOffset(CGPoint.zero, animated: true) } refreshData() } else { tableView.reloadData() } } func headerRefresh() { searchModel.page = 1 tableView.mj_header.endRefreshing() refreshData() } func footerRefresh() { tableView.mj_footer.endRefreshing() searchModel.page += 1 refreshData() } func refreshData() { srvc_searchNow(searchModel: searchModel) } } // MARK: - UITableView extension SESearchResultContentView { func scrollViewDidScroll(_ scrollView: UIScrollView) { if self.delegate != nil { self.delegate?.contentViewDidScroll(self) } } func srvc_heightForRowAt(type: SESearchType) -> CGFloat { switch type { case .repo: return 85 case .user: return 71 case .issue: return 75 case .code: return 0 case .commit: return 0 case .wiki: return 0 } } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return srvc_heightForRowAt(type: searchModel.type) } func srvc_numberOfRowsInSection(type: SESearchType) -> Int { switch type { case .repo: return reposData.items?.count ?? 0 case .user: return usersData.items?.count ?? 0 case .issue: return issueData.items?.count ?? 0 case .code: return codeData.items?.count ?? 0 case .commit: return commitData.items?.count ?? 0 case .wiki: return wikiData.items?.count ?? 0 } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return srvc_numberOfRowsInSection(type: searchModel.type) } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cellId = "" let row = indexPath.row if searchModel.type == .repo { cellId = "BFRepositoryTypeThirdCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeThirdCell if cell == nil { cell = (BFRepositoryTypeThirdCell.cellFromNibNamed("BFRepositoryTypeThirdCell") as? BFRepositoryTypeThirdCell) } if reposData.items == nil { return cell! } if self.reposData.items!.isBeyond(index: row) { return cell! } cell?.setBothEndsLines(row, all: reposData.items!.count) let repos = self.reposData.items![row] cell!.objRepos = repos return cell! } else if searchModel.type == .user { cellId = "BFUserTypeSecCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFUserTypeSecCell if cell == nil { cell = (BFUserTypeSecCell.cellFromNibNamed("BFUserTypeSecCell") as? BFUserTypeSecCell) } cell?.setBothEndsLines(row, all: usersData.items!.count) let user = self.usersData.items![row] cell!.user = user cell!.userNo = row return cell! } else if searchModel.type == .issue { cellId = "CPMesIssueCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? CPMesIssueCell if cell == nil { cell = (CPMesIssueCell.cellFromNibNamed("CPMesIssueCell") as? CPMesIssueCell) } if issueData.items == nil { return cell! } if self.issueData.items!.isBeyond(index: row) { return cell! } cell?.setBothEndsLines(row, all:issueData.items!.count) let issue = self.issueData.items![row] cell!.issue = issue return cell! } else if searchModel.type == .code { } else if searchModel.type == .commit { } return UITableViewCell() } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //视图重置刷新 tableView.deselectRow(at: indexPath, animated: true) if self.delegate != nil { self.delegate?.contentView(self, didSelectRowAt: indexPath) } let row = indexPath.row if searchModel.type == .repo { if !self.reposData.items!.isBeyond(index: row) { let repos = self.reposData.items![row] JumpManager.shared.jumpReposDetailView(repos: repos, from: .search) } } else if searchModel.type == .user { if !self.usersData.items!.isBeyond(index: row) { let user = self.usersData.items![row] JumpManager.shared.jumpUserDetailView(user: user) } } else if searchModel.type == .issue { if !self.issueData.items!.isBeyond(index: row) { let issue = self.issueData.items![row] JumpManager.shared.jumpIssueDetailView(issue: issue) } } else if searchModel.type == .code { } else if searchModel.type == .commit { } } } extension SESearchResultContentView { func srvc_searchNow(searchModel: SESearchBaseModel) { let hud = JSMBHUDBridge.showHud(view: self) SearchProvider.sharedProvider.request(.search(para:searchModel)) { (result) in hud.hide(animated: true) var message = kNoDataFoundTip switch result { case let .success(response): do { if response.statusCode != 200 { let errStr = try response.mapString() print(errStr) return } switch searchModel.type { case .repo: if let reposResult: SEResponseRepos = Mapper().map(JSONString: try response.mapString()) { if self.searchModel.page == 1 { self.reposData.items = reposResult.items } else { self.reposData.items! += reposResult.items! } self.reposData.totalCount = reposResult.totalCount self.reposData.incompleteResults = reposResult.incompleteResults } case .user: if let usersResult: SEResponseUsers = Mapper().map(JSONString: try response.mapString()) { if self.searchModel.page == 1 { self.usersData.items = usersResult.items } else { self.usersData.items! += usersResult.items! } self.usersData.totalCount = usersResult.totalCount self.usersData.incompleteResults = usersResult.incompleteResults } case .issue: if let issueResult: SEResponseIssues = Mapper().map(JSONString: try response.mapString()) { if self.searchModel.page == 1 { self.issueData.items = issueResult.items } else { self.issueData.items! += issueResult.items! } self.issueData.totalCount = issueResult.totalCount self.issueData.incompleteResults = issueResult.incompleteResults } case .code: if let codeResult: SEResponseCode = Mapper().map(JSONString: try response.mapString()) { if self.searchModel.page == 1 { self.codeData.items = codeResult.items } else { self.codeData.items! += codeResult.items! } self.codeData.totalCount = codeResult.totalCount self.codeData.incompleteResults = codeResult.incompleteResults } default: break } self.tableView.reloadData() } catch { JSMBHUDBridge.showError(message, view: self) } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self) } } } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchResultController+Action.swift ================================================ // // SESearchResultController+Action.swift // BeeFun // // Created by WengHengcong on 28/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import iCarousel extension SESearchResultController { // MARK: - Action /// 返回按钮点击 override func leftItemAction(_ sender: UIButton?) { //返回到首页 srvc_jumpToTrendingPage() } /// 取消按钮点击 override func rightItemAction(_ sender: UIButton?) { srvc_jumpToTrendingPage() } /// 点击后返回到首页 func srvc_jumpToTrendingPage() { srvc_disappearKeyboardAndFilterView() //返回到首页 if let stackNv = navigationController?.viewControllers { for vc in stackNv { if vc.isKind(of: BFTrendingController.self) { _ = navigationController?.popToViewController(vc, animated: false) } } } } /// 筛选按钮的点击 @objc func srvc_filterBtnClick(sender: UIControl) { srvc_disappearKeyboardAndFilterView() let tag: SESearchResultFilterButtonType = SESearchResultFilterButtonType(rawValue: sender.tag)! switch tag { case .language: srvc_clickLanuageFilterButton(sender: sender) case .more: break default: srvc_clickSortFilterButton(sender: sender) } } /// 语言筛选,显示语言筛选框 @objc func srvc_clickLanuageFilterButton(sender: UIControl) { sender.isSelected = !sender.isSelected if sender.isSelected { srvc_dismissSearchKeyboard() srvc_showLanguageTableView() } else { srvc_hideLanguageTableView() } } /// 其他三个排序按钮的点击 func srvc_clickSortFilterButton(sender: UIControl) { currentSearchModel = models![currentIndex] currentSearchModel.page = 1 if let btn = sender as? SESearchOrderButton { for button in filterButtons where button != btn { button.selState = .none } let tag: SESearchResultFilterButtonType = SESearchResultFilterButtonType(rawValue: btn.tag)! //sort switch tag { case .stars: currentSearchModel.sort = "stars" case .forks: currentSearchModel.sort = "forks" case .updated: currentSearchModel.sort = "updated" case .followers: currentSearchModel.sort = "followers" case .repositories: currentSearchModel.sort = "repositories" case .joined: currentSearchModel.sort = "joined" case .comments: currentSearchModel.sort = "comments" case .created: currentSearchModel.sort = "created" default: break } //order switch btn.selState { case .none: btn.selState = .up currentSearchModel.order = "desc" case .up: btn.selState = .down currentSearchModel.order = "asc" case .down: btn.selState = .up currentSearchModel.order = "desc" } reloadCarouselData(forceRefresh: true) } } } extension SESearchResultController: UISearchBarDelegate { override func reconnect() { super.reconnect() searchAgain() } /// 点击搜索按钮 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { srvc_dismissSearchKeyboard() searchAgain() } /// 重新搜索 func searchAgain() { searchKey = searchBar.text resetAllSearchModel() srvc_saveSearchKey() //重新加载数据 currentSearchModel = self.models![currentIndex] reloadCarouselData(forceRefresh: true) } /// 保存搜索结果 func srvc_saveSearchKey() { if searchBar.text != nil && searchBar.text!.length > 0 { if let values: [String] = BFUserDefaultManager.shared.searchHistory { var historyData = values if !historyData.contains(searchBar.text!) { //未包含 historyData.append(searchBar.text!) BFUserDefaultManager.shared.searchHistory = historyData } } } } } // MARK: - iCarousel and segment control extension SESearchResultController { // MARK: - Segment control 点击 func segmentControlChange(index: Int) { currentSearchModel = models![currentIndex] self.clickTag = true self.carouselContent.scrollToItem(at: index, animated: true) srvc_resetFilterButtons() } // MARK: - iCarousel func numberOfItems(in carousel: iCarousel) -> Int { return segControl.sectionTitles.count } //1. 先获取view func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { let contentView = SESearchResultContentView(frame: carousel.bounds, index: index, searchModel: currentSearchModel) contentView.delegate = self reloadCarouselData(forceRefresh: true) return contentView } //2. index change func carouselCurrentItemIndexDidChange(_ carousel: iCarousel) { if carouselContent == carousel { // 如果是点击segment控件,则不需要改变tag index if !clickTag { if !segControl.sectionTitles.isBeyond(index: currentIndex) { segControl.setSelectedSegmentIndex(UInt(currentIndex), animated: true) } } clickTag = false reloadCarouselData(forceRefresh: true) srvc_resetFilterButtons() } } /// 获取当前内容视图 /// /// - Returns: func currentCarouselContentView() -> SESearchResultContentView? { let view = carouselContent.currentItemView as? SESearchResultContentView return view } /// 重新加载carousel数据 /// /// - Parameter forceRefresh: 是否强制刷新当前页面数据 func reloadCarouselData(forceRefresh: Bool) { currentCarouselContentView()?.searchModel = currentSearchModel currentCarouselContentView()?.forceRefresh = forceRefresh currentCarouselContentView()?.reloadNetworkData() } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchResultController+View.swift ================================================ // // SESearchResultController+View.swift // BeeFun // // Created by WengHengcong on 07/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit enum SESearchResultFilterButtonType: Int { case language = 0 case more //Repo case stars case forks // case updated //User case followers case repositories case joined //Issue case comments case created case updated } extension SESearchResultController { func srvc_setupView() { view.backgroundColor = UIColor.white srvc_setupNav() srvc_setupFilterBarView() srvc_setupLanguageTableView() srvc_setupSegmentControl() srvc_setupCarouselView() srvc_dismissSearchKeyboard() } func srvc_setupNav() { title = searchKey ?? "Search".localized if #available(iOS 11.0, *) { searchBar.keepBeforeStyle = true } searchBar.barTintColor = UIColor.clear searchBar.backgroundColor = UIColor.clear searchBar.isTranslucent = true searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default) searchBar.placeholder = "Search".localized searchBar.text = searchKey searchBar.delegate = self navigationItem.titleView = searchBar searchBar.becomeFirstResponder() rightItemImage = UIImage(named: "nav_cancel") rightItem?.isHidden = false } func srvc_setupFilterBarView() { let filterBarH: CGFloat = 40 filterBarView.frame = CGRect(x: 0, y: uiTopBarHeight, w: ScreenSize.width, h: filterBarH) filterBarView.addBorderSingle(at: .bottom) view.addSubview(filterBarView) let btnW = ScreenSize.width/5.0 let lanW = filterBarH-15 let lagY = (filterBarH-lanW)/2.0 let lanBtn = UIButton(frame: CGRect(x: (btnW-lanW)/2.0-10, y: lagY, w: lanW, h: lanW)) lanBtn.setImage(UIImage(named: "se_lang_switch"), for: .normal) lanBtn.tag = SESearchResultFilterButtonType.language.rawValue lanBtn.addTarget(self, action: #selector(srvc_filterBtnClick(sender:)), for: .touchUpInside) filterBarView.addSubview(lanBtn) let starBtn = SESearchOrderButton(title: "Stars".localized, frame: CGRect(x: btnW, y: 0, w: btnW, h: filterBarH)) starBtn.tag = SESearchResultFilterButtonType.stars.rawValue starBtn.addTarget(self, action: #selector(srvc_filterBtnClick(sender:)), for: .touchUpInside) filterBarView.addSubview(starBtn) filterButtons.append(starBtn) let forkBtn = SESearchOrderButton(title: "Forks".localized, frame: CGRect(x: starBtn.right, y: 0, w: btnW, h: filterBarH)) forkBtn.tag = SESearchResultFilterButtonType.forks.rawValue forkBtn.addTarget(self, action: #selector(srvc_filterBtnClick(sender:)), for: .touchUpInside) filterBarView.addSubview(forkBtn) filterButtons.append(forkBtn) let updatedBtn = SESearchOrderButton(title: "Updated".localized, frame: CGRect(x: forkBtn.right, y: 0, w: btnW, h: filterBarH)) updatedBtn.tag = SESearchResultFilterButtonType.updated.rawValue updatedBtn.addTarget(self, action: #selector(srvc_filterBtnClick(sender:)), for: .touchUpInside) filterBarView.addSubview(updatedBtn) filterButtons.append(updatedBtn) } func srvc_resetFilterButtons() { for (index, btn) in filterButtons.enumerated() { btn.resetState() if currentIndex == 0 { if index == 0 { btn.title = "Stars".localized btn.tag = SESearchResultFilterButtonType.stars.rawValue } else if index == 1 { btn.title = "Forks".localized btn.tag = SESearchResultFilterButtonType.forks.rawValue } else if index == 2 { btn.title = "Updated".localized btn.tag = SESearchResultFilterButtonType.updated.rawValue } } else if currentIndex == 1 { if index == 0 { btn.title = "Followers".localized btn.tag = SESearchResultFilterButtonType.followers.rawValue } else if index == 1 { btn.title = "Repos".localized btn.tag = SESearchResultFilterButtonType.repositories.rawValue } else if index == 2 { btn.title = "Joined".localized btn.tag = SESearchResultFilterButtonType.joined.rawValue } } else if currentIndex == 2 { if index == 0 { btn.title = "Comments".localized btn.tag = SESearchResultFilterButtonType.comments.rawValue } else if index == 1 { btn.title = "Created".localized btn.tag = SESearchResultFilterButtonType.created.rawValue } else if index == 2 { btn.title = "Updated".localized btn.tag = SESearchResultFilterButtonType.updated.rawValue } } } } func srvc_setupSegmentControl() { segControl.frame = CGRect(x: 0, y: filterBarView.bottom, width: ScreenSize.width, height: 35) segControl.indexChangeBlock = { index in self.segmentControlChange(index: index) } view.addSubview(segControl) } // MARK: - carouse 内容视图 func srvc_setupCarouselView() { let scroolY = segControl.bottom let scroolH = ScreenSize.height-scroolY-3 carouselContent.isHidden = false carouselContent.delegate = self carouselContent.dataSource = self carouselContent.type = .linear // carouselContent.isPagingEnabled = true carouselContent.decelerationRate = 0.5 carouselContent.frame = CGRect(x: 0, y: scroolY, w: ScreenSize.width, h: scroolH) // carouselContent.scrollToItem(at: 0, animated: true) view.addSubview(carouselContent) } // MARK: - Language table func srvc_setupLanguageTableView() { languageTable.frame = CGRect(x: -languageTabWidth, y: filterBarView.bottom, w: languageTabWidth, h: ScreenSize.height-filterBarView.bottom) languageTable.delegate = self languageTable.dataSource = self languageTable.addBorderSingle(at: .right) languageTable.separatorStyle = .singleLine if #available(iOS 11, *) { languageTable.estimatedRowHeight = 0 languageTable.estimatedSectionHeaderHeight = 0 languageTable.estimatedSectionFooterHeight = 0 } view.addSubview(languageTable) view.bringSubviewToFront(languageTable) maskView.backgroundColor = UIColor.iOS11Black // view.addSubview(maskView) } func srvc_showLanguageTableView() { view.bringSubviewToFront(languageTable) languageTable.isHidden = false UIView.animate(withDuration: 0.25) { let lanFrame = CGRect(x: 0, y: self.filterBarView.bottom, w: self.languageTabWidth, h: ScreenSize.height-self.filterBarView.bottom) _ = CGRect(x: self.languageTabWidth, y: self.filterBarView.bottom, w: ScreenSize.width-self.languageTabWidth, h: self.languageTable.height) self.languageTable.frame = lanFrame // self.maskView.frame = maskFrame } } // MARK: - 消失 /// 键盘及筛选语言视图均消失 func srvc_disappearKeyboardAndFilterView() { srvc_dismissSearchKeyboard() srvc_hideLanguageTableView() } /// 筛选语言视图消息 func srvc_hideLanguageTableView() { languageTable.isHidden = true UIView.animate(withDuration: 0.25) { let maskW = ScreenSize.width-self.languageTabWidth let lanFrame = CGRect(x: -ScreenSize.width, y: self.filterBarView.bottom, w: self.languageTabWidth, h: ScreenSize.height-self.filterBarView.bottom) _ = CGRect(x: -maskW, y: self.filterBarView.bottom, w: maskW, h: self.languageTable.height) self.languageTable.frame = lanFrame // self.maskView.frame = maskFrame } } /// 键盘消失 func srvc_dismissSearchKeyboard() { searchBar.endEditing(true) searchBar.resignFirstResponder() view.endEditing(true) view.resignFirstResponder() } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchResultController.swift ================================================ // // SESearchResultController.swift // BeeFun // // Created by WengHengcong on 05/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import HMSegmentedControl import iCarousel class SESearchResultController: BFBaseViewController, SESearchResultContentDelegate, iCarouselDataSource, iCarouselDelegate { var searchKey: String? //导航栏 lazy var searchBar = JSSearchBar(frame: CGRect(x: 10, y: 0, width: ScreenSize.width-100, height: 28)) //筛选视图 var filterBarView: UIView = UIView() var filterButtons: [SESearchOrderButton] = [] //结果分类视图 var segControl: HMSegmentedControl! = JSHMSegmentedBridge.segmentControl(titles: ["Repositories".localized, "Users".localized, "Issues".localized]) //语言选择视图 lazy var languageTable = UITableView() lazy var maskView = UIView() let languageTabWidth = ScreenSize.width - 130 var popularLanguage: [String]? = [] var allLanguage: [String]? = [] var otherLanguage: [String]? = [] //carousel var carouselContent: iCarousel = iCarousel() var clickTag: Bool = false var currentIndex: Int { if carouselContent.currentItemIndex < 0 || carouselContent.currentItemIndex >= segControl.sectionTitles.count { return 0 } return carouselContent.currentItemIndex } //search parameter var firstRequest: Bool = true var currentSearchModel: SESearchBaseModel { set {} get { if models != nil { return models![currentIndex] } else { return SESearchBaseModel() } } } var searchRepoModel: SESearchRepoModel = SESearchRepoModel() var searchUserModel: SESearchUserModel = SESearchUserModel() var searchIssueModel: SESearchIssueModel = SESearchIssueModel() var searchCodeModel: SESearchCodeModel = SESearchCodeModel() var searchCommitModel: SESearchCommitModel = SESearchCommitModel() var searchWikiModel: SESearchWikiModel = SESearchWikiModel() var models: [SESearchBaseModel]? // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() srvc_loadData() srvc_loadSearchModel() srvc_setupView() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(true) srvc_dismissSearchKeyboard() self.languageTable.isHidden = true } // MARK: - Data func srvc_loadData() { //语言数据记载 if let path = Bundle.appBundle.path(forResource: "BFPopularLanguage", ofType: "plist") { popularLanguage = NSArray(contentsOfFile: path)! as? [String] } if let path = Bundle.appBundle.path(forResource: "BFLanguage", ofType: "plist") { allLanguage = NSArray(contentsOfFile: path)! as? [String] } otherLanguage = allLanguage!.difference(popularLanguage!) } func srvc_searchRequestURL(type: SESearchType) -> String { var url = "repositories" switch type { case .repo: url = "repositories" case .user: url = "users" case .issue: url = "issues" case .wiki: url = "" case .commit: url = "commits" case .code: url = "code" } return url } func srvc_loadSearchModel() { models = [searchRepoModel, searchUserModel, searchIssueModel] for (index, model) in models!.enumerated() { model.keyword = searchKey model.perPage = 10 model.page = 1 model.type = SESearchType(rawValue: index)! model.requestUrl = srvc_searchRequestURL(type: model.type) } } func resetAllSearchModel() { for model in models! { model.keyword = searchKey model.page = 1 } } } // MARK: - SESearchResultContentDelegate extension SESearchResultController { func contentViewDidScroll(_ conetView: SESearchResultContentView) { srvc_disappearKeyboardAndFilterView() } func contentView(_ contentView: SESearchResultContentView, didSelectRowAt indexPath: IndexPath) { srvc_disappearKeyboardAndFilterView() } } // MARK: - table view extension SESearchResultController { func numberOfSections(in tableView: UITableView) -> Int { return 2 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return section == 0 ? popularLanguage!.count : otherLanguage!.count } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 30 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellId = "Language" let row = indexPath.row let section = indexPath.section var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFSwipeCell if cell == nil { cell = BFSwipeCell(style: .default, reuseIdentifier: cellId) } cell?.textLabel?.font = UIFont.smallSizeSystemFont() if section == 0 { cell?.textLabel?.text = popularLanguage![row] } else { cell?.textLabel?.text = otherLanguage![row] } cell?.textLabel?.textColor = UIColor.iOS11Black return cell! } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return section == 0 ? "Popular" : "Everything else" } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //视图重置刷新 tableView.deselectRow(at: indexPath, animated: true) srvc_disappearKeyboardAndFilterView() currentSearchModel = models![currentIndex] currentSearchModel.page = 1 var lanStr = "" if indexPath.section == 0 { lanStr = popularLanguage![indexPath.row].lowercased() } else { lanStr = otherLanguage![indexPath.row].lowercased() } currentSearchModel.languagePara = lanStr reloadCarouselData(forceRefresh: true) } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchViewController+View.swift ================================================ // // SESearchViewController+View.swift // BeeFun // // Created by WengHengcong on 07/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit extension SESearchViewController { // MARK: - View func svc_setupNavBar() { searchBar.placeholder = "Search".localized searchBar.delegate = self navigationItem.titleView = searchBar searchBar.becomeFirstResponder() if #available(iOS 11.0, *) { searchBar.keepBeforeStyle = true } rightItemImage = UIImage(named: "nav_cancel") rightItem?.isHidden = false } func svc_setupHistoryTable() { historyTable.frame = CGRect(x: 0, y: 0, w: ScreenSize.width, h: ScreenSize.height) historyTable.register(UITableViewCell.self, forCellReuseIdentifier: cellID) historyTable.delegate = self historyTable.dataSource = self historyTable.separatorStyle = .singleLine if #available(iOS 11, *) { historyTable.estimatedRowHeight = 0 historyTable.estimatedSectionHeaderHeight = 0 historyTable.estimatedSectionFooterHeight = 0 } view.addSubview(historyTable) } } ================================================ FILE: BeeFun/BeeFun/View/Search/SESearchViewController.swift ================================================ // // SESearchViewController.swift // BeeFun // // Created by WengHengcong on 01/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// 搜索模块:SE前缀 class SESearchViewController: BFBaseViewController { lazy var searchBar = JSSearchBar(frame: CGRect(x: 10, y: 0, width: ScreenSize.width-100, height: 28)) lazy var historyTable = UITableView() let cellID = "History" var historyData: [String] = [] override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.white svc_setupNavBar() svc_setupHistoryTable() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) svc_loadHistoryData() } // MARK: - Data func svc_loadHistoryData() { if let values: [String] = BFUserDefaultManager.shared.searchHistory { historyData = values if historyData.isEmpty { historyTable.isHidden = true } else { historyTable.reloadData() } } } // MARK: - Action override func leftItemAction(_ sender: UIButton?) { svc_dismissSearchKeyboard() svc_jumpToTrendingPage() } @objc func svc_clearAllRecords() { let alertController = UIAlertController(title: "Clear all history records?".localized, message:nil, preferredStyle: .alert) alertController.addAction(title: "Cancel".localized, style: .cancel, handler: { (_) in }) alertController.addAction(title: "Sure".localized, style: .default, handler: { (_) in let empty: [String] = [] BFUserDefaultManager.shared.searchHistory = empty self.svc_loadHistoryData() }) self.present(alertController, animated: true, completion: { }) } override func rightItemAction(_ sender: UIButton?) { svc_dismissSearchKeyboard() svc_jumpToTrendingPage() } func svc_jumpToTrendingPage() { //返回到首页 if let stackNv = navigationController?.viewControllers { for vc in stackNv { if vc.isKind(of: BFTrendingController.self) { _ = navigationController?.popToViewController(vc, animated: true) } } } } func svc_jumpSearchResultPage(searchKey: String?) { let resultVC = SESearchResultController() resultVC.hidesBottomBarWhenPushed = true resultVC.searchKey = searchBar.text ?? "BeeFun" navigationController?.pushViewController(resultVC, animated: true) } } // MARK: - Tableview Delegate extension SESearchViewController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 40 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { svc_dismissSearchKeyboard() let selRecord = historyData[indexPath.row] if !selRecord.isEmpty { searchBar.text = selRecord svc_jumpSearchResultPage(searchKey: selRecord) } } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { let bgV = UIView() bgV.frame = CGRect(x: 0, y: 0, w: ScreenSize.width, h: 36) bgV.addBorderSingle(at: .bottom) let historyL = UILabel() historyL.frame = CGRect(x: 15, y: 5, w: ScreenSize.width, h: 28) historyL.text = "Historical records".localized bgV.addSubview(historyL) return bgV } return nil } func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { if section == 0 { let bgV = UIView() bgV.frame = CGRect(x: 0, y: 20, w: ScreenSize.width, h: 35) let clearAllBtn = UIButton() let x: CGFloat = 45 clearAllBtn.frame = CGRect(x: x, y: 20, w: ScreenSize.width-2*x, h: 35) clearAllBtn.backgroundColor = UIColor.bfRedColor clearAllBtn.layer.cornerRadius = 4.0 clearAllBtn.layer.masksToBounds = true clearAllBtn.setTitleColor(UIColor.white, for: .normal) clearAllBtn.addTarget(self, action: #selector(svc_clearAllRecords), for: .touchUpInside) clearAllBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 17.0) clearAllBtn.setTitle("Clear All Records".localized, for: .normal) bgV.addSubview(clearAllBtn) return bgV } return nil } } // MARK: - Tableview Datasource extension SESearchViewController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return historyData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: cellID) as? BFSwipeCell if cell == nil { cell = BFSwipeCell(style: .default, reuseIdentifier: cellID) } cell?.textLabel?.text = historyData[indexPath.row] cell?.textLabel?.textColor = UIColor.bfLabelSubtitleTextColor // cell?.delegate = self cell?.setBothEndsLines(indexPath.row, all: historyData.count) return cell! } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 && historyData.count > 0 { return 36 } return 0 } func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { if section == 0 && historyData.count > 0 { return 35 } return 0 } } extension SESearchViewController: UISearchBarDelegate { func svc_dismissSearchKeyboard() { searchBar.endEditing(true) searchBar.resignFirstResponder() view.endEditing(true) view.resignFirstResponder() } func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { svc_dismissSearchKeyboard() svc_saveSearchKey() svc_jumpSearchResultPage(searchKey: searchBar.text) } func svc_saveSearchKey() { if searchBar.text != nil && searchBar.text!.length > 0 { if !historyData.contains(searchBar.text!) { //未包含 historyData.append(searchBar.text!) BFUserDefaultManager.shared.searchHistory = historyData } } } } // MARK: - Scroll Delegate extension SESearchViewController { func scrollViewDidScroll(_ scrollView: UIScrollView) { searchBar.endEditing(true) } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchBaseModel.swift ================================================ // // SESearchBaseModel.swift // BeeFun // // Created by WengHengcong on 10/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit enum SESearchType: Int { case repo, user, issue, code, commit, wiki } open class SESearchBaseModel: NSObject { var type: SESearchType = .repo var requestUrl: String var keyword: String? { didSet { q = combineQuery() } } var q: String { didSet { q = combineQuery() } } var sort: String { didSet { q = combineQuery() } } var order: String { didSet { q = combineQuery() } } var languagePara: String? { didSet { q = combineQuery() } } //page var page: Int = 1 var perPage: Int = 10 init(requestURL: String, query: String, sort: String, order: String) { self.requestUrl = requestURL self.q = query self.sort = sort self.order = order } convenience override init() { self.init(requestURL:"", query:"", sort:"", order:"desc") } func combineQuery() -> String { var query = "" if keyword != nil { query += "\(keyword!)" } //language:javascript if languagePara != nil { query += " language:\(languagePara!)" } return query } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchCodeModel.swift ================================================ // // SESearchCodeModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit open class SESearchCodeModel: SESearchBaseModel { } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchCommitModel.swift ================================================ // // SESearchCommitModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit open class SESearchCommitModel: SESearchBaseModel { } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchIssueModel.swift ================================================ // // SESearchIssueModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit open class SESearchIssueModel: SESearchBaseModel { } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchRepoModel.swift ================================================ // // SESearchRepoModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit public enum SearchReposQueryPrefix: String { case In = "in" case Size = "size" case Forks = "forks" //The second way is to specify whether forked repositories should be included in results at all. By default, forked repositories are not shown. You can choose to include forked repositories by adding fork:true to your search. Or, if you only want forked repositories, add fork:only to your search. case Fork = "fork" case User = "user" case Language = "language" case Stars = "stars" case Created = "created" case Pushed = "pushed" } public enum ReposInField: String { //Without the qualifier, only the name and description are searched. //jquery in:name,description case Default = "" case Name = "name" case Description = "description" case Readme = "readme" } open class SESearchRepoModel: SESearchBaseModel { //ccombine all parameters to q //now support only one to one,but github api support one to many //such as,type:org type:user,but now support only type:user or type:org override var languagePara: String? { didSet { q = combineQuery() } } override var keyword: String? { didSet { q = combineQuery() } } var inPara: ReposInField? { didSet { q = combineQuery() } } var sizePara: String? { didSet { q = combineQuery() } } var forksPara: String? { didSet { q = combineQuery() } } var forkPara: Bool? { didSet { q = combineQuery() } } var userPara: String? { didSet { q = combineQuery() } } var starsPara: String? { didSet { q = combineQuery() } } var createdPara: String? { didSet { q = combineQuery() } } var pushedPara: String? { didSet { q = combineQuery() } } override func combineQuery() -> String { var query = "" if keyword != nil { query += "\(keyword!)" } //in:email if inPara != nil { let inStr = inPara!.rawValue query += " in:\(inStr)" } //size:50..120 if sizePara != nil { query += " size:\(sizePara!)" } //forks:>=205 if forksPara != nil { query += " forks:\(forksPara!)" } //forks:>=205 if forkPara != nil { query += " fork:\(forksPara!)" } //user:github if userPara != nil { query += " user:\(userPara!)" } //language:javascript if languagePara != nil { query += " language:\(languagePara!)" } //created:<2011-01-01 if createdPara != nil { query += " created:\(createdPara!)" } //pushed:<2011-01-01 if pushedPara != nil { query += " pushed:\(pushedPara!)" } //stars:10..20 if starsPara != nil { query += " stars:\(starsPara!)" } if query.isEmpty || (query == "") { query = "in:name,description" } return query } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchUserModel.swift ================================================ // // SESearchUserModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit public enum SearchUserQueryPrefix: String { case Typee = "type" case In = "in" case Repos = "repos" case Location = "location" case Language = "language" case Followers = "followers" case Created = "created" } public enum UserType: String { case Default = "" case User = "user" case Org = "org" } public enum UserInField: String { case Default = "" case Email = "email" case UserName = "login" case FullName = "fullname" } open class SESearchUserModel: SESearchBaseModel { //ccombine all parameters to q //now support only one to one,but github api support one to many //such as,type:org type:user,but now support only type:user or type:org override var languagePara: String? { didSet { q = combineQuery() } } override var keyword: String? { didSet { q = combineQuery() } } var typePara: UserType? { didSet { q = combineQuery() } } var inPara: UserInField? { didSet { q = combineQuery() } } var reposPara: String? { didSet { q = combineQuery() } } var locationPara: String? { didSet { q = combineQuery() } } var createdPara: String? { didSet { q = combineQuery() } } var followersPara: String? { didSet { q = combineQuery() } } override func combineQuery() -> String { var query = "" if keyword != nil { query += "\(keyword!)" } //type:org if typePara != nil { let typeStr = typePara!.rawValue query += " type:\(typeStr)" } //in:email if inPara != nil { let inStr = inPara!.rawValue query += " in:\(inStr)" } //repos:>9000 if reposPara != nil { query += " repos:\(reposPara!)" } //location:iceland if locationPara != nil { query += " location:\(locationPara!)" } //language:javascript if languagePara != nil { query += " language:\(languagePara!)" } //created:<2011-01-01 if createdPara != nil { query += " created:\(createdPara!)" } //followers:>=1000 if followersPara != nil { query += " followers:\(followersPara!)" } if query.isEmpty || (query == "") { query = "type:user" } return query } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModel/SESearchWikiModel.swift ================================================ // // SESearchWikiModel.swift // BeeFun // // Created by WengHengcong on 09/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit open class SESearchWikiModel: SESearchBaseModel { } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/se_down_triangle.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "三角下标(正方形) (2).png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/se_down_triangle_sel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "down_ triangle@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/se_lang_switch.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "language_switch@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/se_up_triangle.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "三角下标(正方形) (3).png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/SearchModule.xcassets/se_up_triangle_sel.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "idiom" : "universal", "filename" : "up_ triangle@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: BeeFun/BeeFun/View/Search/ViewCell/SESearchCodeCell.swift ================================================ // // SESearchCodeCell.swift // BeeFun // // Created by WengHengcong on 11/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class SESearchCodeCell: BFBaseCell { } ================================================ FILE: BeeFun/BeeFun/View/Search/ViewCell/SESearchOrderButton.swift ================================================ // // SESearchOrderButton.swift // BeeFun // // Created by WengHengcong on 07/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// order按钮的选中状态 /// /// - none: 未选中 /// - up: 选中上面按钮 /// - down: 选中下面按钮 enum SESearchOrderButtonState: Int { case none case up case down } class SESearchOrderButton: UIControl { var titleLabel = UILabel() var upImageView = UIImageView(image:UIImage(named: "se_up_triangle")) var downImageView = UIImageView(image:UIImage(named: "se_down_triangle")) var title: String? { didSet { titleLabel.text = title setNeedsLayout() } } var selState: SESearchOrderButtonState = .none { didSet { sob_setState() } } override init(frame: CGRect) { super.init(frame: frame) } convenience init(title: String, frame: CGRect) { self.init(frame: frame) self.title = title sob_setupView() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func resetState() { selState = .none setNeedsLayout() } func sob_setupView() { // backgroundColor = UIColor.green if title == nil { title = "" } titleLabel.text = self.title titleLabel.textAlignment = .right titleLabel.adjustFontSizeToFitWidth(minScale: 0.5) titleLabel.font = UIFont.middleSizeSystemFont() addSubview(titleLabel) addSubview(upImageView) addSubview(downImageView) } override func layoutSubviews() { super.layoutSubviews() let selfHeight = self.height var titleW = self.title!.width(with: selfHeight, font: UIFont.middleSizeSystemFont()) if titleW < 5.0 { titleW += 2.0 } let imgW: CGFloat = 12.0 upImageView.frame = CGRect(x: self.width-imgW-2.0, y: 10, w: imgW, h: imgW) downImageView.frame = CGRect(x: upImageView.left, y: upImageView.bottom-4, w: imgW, h: imgW) titleLabel.frame = CGRect(x: upImageView.left-titleW-2.0, y: 0, w: titleW, h: selfHeight) } func sob_setState() { var upImgageName = "se_up_triangle" var downImgageName = "se_down_triangle" switch selState { case .none: upImgageName = "se_up_triangle" downImgageName = "se_down_triangle" case .up: upImgageName = "se_up_triangle_sel" downImgageName = "se_down_triangle" case .down: upImgageName = "se_up_triangle" downImgageName = "se_down_triangle_sel" } upImageView.image = UIImage(named: upImgageName) downImageView.image = UIImage(named: downImgageName) setNeedsLayout() } } ================================================ FILE: BeeFun/BeeFun/View/Stars/BFStarContentView.swift ================================================ // // BFStarContentView.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BFStarContentView: UIView, UITableViewDelegate, UITableViewDataSource, MJRefreshManagerAction { //Reload View let reloadViewTag = 19999 // 重试提醒 var reloadTip = "Wake up your connection!".localized // 重试提醒的图片 var reloadImage = "network_error_1" //重试加载按钮的title var reloadActionTitle = "Try Again".localized //Reload View let emptyViewTag = 19998 // 无数据提醒 var emptyTip = "Empty now,star repositories and tag it".localized // 无数据提醒的图片 var emptyImage = "empty_data" // 无数据按钮的title var emptyActionTitle = "Explore more".localized /// 是否显示空白视图 var showEmpty = false // MARK: - View var tableView: UITableView = UITableView() let refreshManager = MJRefreshManager() // MARK: - Data /// 当前页面所对应的tag var tagTitle: String? var starReposData: [ObjRepos] = [] var reposPageVal = 1 var reposPerpage = 15 var sortVal: String = "created" var directionVal: String = "desc" override init(frame: CGRect) { super.init(frame: frame) setupTableView() } convenience init(frame: CGRect, tag: String) { self.init(frame: frame) self.tagTitle = tag } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } private func setupTableView() { tableView.frame = self.bounds tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none refreshManager.delegate = self tableView.mj_header = refreshManager.header() tableView.mj_footer = refreshManager.footer() tableView.backgroundColor = UIColor.white if #available(iOS 11, *) { tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 } addSubview(tableView) } /// 当前页面是否已经拉取到数据 func hasData() -> Bool { return starReposData.count > 0 } /// 重新加载本页面数据 /// /// - Parameter force: 是否需要强制去请求去拿网络数据 func reloadNetworkData(force: Bool) { if UserManager.shared.isLogin {//已登录 tableView.mj_footer.isHidden = false if force { requestFirstPage() } else { if !hasData() { requestFirstPage() } } } else { clearAllData() //加载未登录的页面 tableView.mj_footer.isHidden = true } } private func clearAllData() { starReposData.removeAll() tableView.reloadData() } private func requestFirstPage() { reposPageVal = 1 svc_getStaredReposRequest(reposPageVal) } private func requestNextPage() { reposPageVal += 1 svc_getStaredReposRequest(reposPageVal) } } // MARK: - Refresh extension BFStarContentView { func headerRefresh() { tableView.mj_header.endRefreshing() requestFirstPage() } func footerRefresh() { tableView.mj_footer.endRefreshing() requestNextPage() } } // MARK: - empty and network error extension BFStarContentView: BFPlaceHolderViewDelegate { func showReloadView() { removeReloadView() tableView.isHidden = true let placeReloadView = BFPlaceHolderView(frame: self.frame, tip: reloadTip, image: reloadImage, actionTitle: reloadActionTitle) placeReloadView.placeHolderActionDelegate = self placeReloadView.tag = reloadViewTag insertSubview(placeReloadView, at: 0) self.bringSubviewToFront(placeReloadView) } func removeReloadView() { if let reloadView = viewWithTag(reloadViewTag) { reloadView.removeFromSuperview() } tableView.isHidden = false } func didAction(place: BFPlaceHolderView) { self.reloadNetworkData(force: true) } } extension BFStarContentView { /// Get stared repos @objc private func svc_getStaredReposRequest(_ pageVal: Int) { if DeviceType.isPad { reposPerpage = 25 } if tagTitle == nil || tagTitle?.length == 0 { return } let hud = JSMBHUDBridge.showHud(view: self) BeeFunProvider.sharedProvider.request(BeeFunAPI.repos(tag: tagTitle!, language: "all", page: pageVal, perpage: reposPerpage, sort: "starred_at", direction: "desc")) { (result) in self.showEmpty = false hud.hide(animated: true) switch result { case let .success(response): do { if let allRepos: GetReposResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = allRepos.codeEnum, code == BFStatusCode.bfOk { if let data = allRepos.data { DispatchQueue.main.async { self.hanldeStaredRepoResponse(repos: data) } } } } } catch { self.showReloadView() } case .failure: self.showReloadView() } } } private func hanldeStaredRepoResponse(repos: [ObjRepos]) { removeReloadView() if reposPageVal == 1 { self.starReposData.removeAll() self.starReposData = repos } else { self.starReposData += repos } if starReposData.count == 0 { showEmpty = true } else { showEmpty = false } tableView.reloadData() } } // MARK: - TableViewdatasource extension BFStarContentView: BFEmptyDataCellDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return showEmpty ? 1 : starReposData.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row if !showEmpty { let cellId = "BFRepositoryTypeOneCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeOneCell if cell == nil { cell = (BFRepositoryTypeOneCell.cellFromNibNamed("BFRepositoryTypeOneCell") as? BFRepositoryTypeOneCell) } if !starReposData.isBeyond(index: row) { cell?.setBothEndsLines(row, all: starReposData.count) let repos = starReposData[row] cell!.objRepos = repos } return cell! } else { let cellId = "BFEmptyStarDataCell" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFEmptyDataCell if cell == nil { cell = BFEmptyDataCell(style: .default, reuseIdentifier: cellId) cell?.display(tip: emptyTip, imageName: emptyImage, actionTitle: emptyActionTitle) } cell?.delegate = self return cell! } } func didClickEmptyAction(cell: BFEmptyDataCell) { BFTabbarManager.shared.goto(index: 0) } } // MARK: - Tableview delegate extension BFStarContentView { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if showEmpty { return height } return 85 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if showEmpty { return } tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row if !starReposData.isBeyond(index: row) { let repos = starReposData[row] JumpManager.shared.jumpReposDetailView(repos: repos, from: .star) } } } ================================================ FILE: BeeFun/BeeFun/View/Stars/BFStarController+Data.swift ================================================ // // BFStarController+Data.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper extension BFStarController { override func request() { super.request() svc_requestFetchTags(reloadCurrentPageData: true) } override func reconnect() { super.reconnect() svc_requestFetchTags(reloadCurrentPageData: true) } // MARK: - 获取Tag数据 func svc_requestFetchTags(reloadCurrentPageData: Bool) { let hud = JSMBHUDBridge.showHud(view: view) if !UserManager.shared.needLoginAlert() { _ = checkCurrentLoginState() hud.hide(animated: true) return } if let owner = UserManager.shared.login { tagFilter.owner = owner } tagFilter.page = 1 tagFilter.pageSize = 100000 tagFilter.sord = "desc" tagFilter.sidx = "name" var dict: [String: Any] = [:] do { dict = try JSONSerialization.jsonObject(with: try JSONEncoder().encode(tagFilter), options: []) as! [String: Any] } catch { print("tag filter is error") } BeeFunProvider.sharedProvider.request(BeeFunAPI.getAllTags(filter: dict) ) { (result) in hud.hide(animated: true) switch result { case let .success(response): do { if let allTag: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = allTag.codeEnum, code == BFStatusCode.bfOk { if let data = allTag.data { DispatchQueue.main.async { self.handleGetAllTagsRequestResponse(data: data, reloadCurrentPageData: reloadCurrentPageData) } return } } } } catch { } self.showReloadView() self.changeNavSegmentControl(index: self.navSegmentView!.selIndex) case .failure: self.showReloadView() self.changeNavSegmentControl(index: self.navSegmentView!.selIndex) } } } /// 处理网络获取到的tag数据 func handleGetAllTagsRequestResponse(data: [ObjTag], reloadCurrentPageData: Bool) { removeReloadView() carouselContent.isHidden = false starTags.removeAll() if data.count > 0 { self.starTags.insert("All", at: 0) for tag in data { self.starTags.append(tag.name!) } } svc_customViewAfterGetTags() if self.starTags.count > 0 && self.tagBar != nil { self.tagBar.sectionTitles = self.starTags self.svc_layoutAllTagsButton() } if reloadCurrentPageData { // 重新加载页面数据 carouselContent.reloadData() currentContentView()?.reloadNetworkData(force: true) } } /// Get watched repos func svc_getWatchedReposRequest(_ pageVal: Int) { if !UserManager.shared.isLogin { return } let username = UserManager.shared.login if DeviceType.isPad { watchPerpage = 25 } let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request( .userWatchedRepos( page:pageVal, perpage:watchPerpage, username:username!) ) { (result) -> Void in print(result) hud.hide(animated: true) var message = kNoDataFoundTip switch result { case let .success(response): do { let repos: [ObjRepos] = try response.mapArray(ObjRepos.self) if self.watchPageVal == 1 { self.watchsData.removeAll() self.watchsData = repos } else { self.watchsData += repos } self.watchedTableView.reloadData() } catch { JSMBHUDBridge.showError(message, view: self.view) } case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } ================================================ FILE: BeeFun/BeeFun/View/Stars/BFStarController+Noti.swift ================================================ // // BFStarController+Noti.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit extension BFStarController { // MARK: - Notification func svc_registerNotification() { //删除tag需要重新加载 NotificationCenter.default.addObserver(self, selector: #selector(svc_tagChange(noti:)), name: NSNotification.Name.BeeFun.DelTag, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(svc_tagChange(noti:)), name: NSNotification.Name.BeeFun.AddTag, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(svc_tagChange(noti:)), name: NSNotification.Name.BeeFun.UpdateTag, object: nil) //update tag需要重新加载 NotificationCenter.default.addObserver(self, selector: #selector(svc_updateRepoTag(noti:)), name: NSNotification.Name.BeeFun.RepoUpdateTag, object: nil) //star repo需要重新加载 NotificationCenter.default.addObserver(self, selector: #selector(svc_starRepo(noti:)), name: NSNotification.Name.BeeFun.didStarRepo, object: nil) //unstar repo需要重新加载 NotificationCenter.default.addObserver(self, selector: #selector(svc_unstarRepo(noti:)), name: NSNotification.Name.BeeFun.didUnStarRepo, object: nil) } // MARK: - Handle Notification override func loginSuccessful() { svc_requestFetchTags(reloadCurrentPageData: true) svc_updateDataWhenReceiveNotification() self.carouselContent.reloadData() } override func logoutSuccessful() { starTags = ["All".localized] if tagBar != nil { tagBar.sectionTitles = starTags tagBar.selectedSegmentIndex = 0 svc_layoutAllTagsButton() } carouselContent.scrollToItem(at: 0, animated: true) carouselContent.reloadData() watchsData.removeAll() watchedTableView.reloadData() self.carouselContent.reloadData() } // MARK: - tag delete / addd @objc func svc_tagChange(noti: Notification) { svc_requestFetchTags(reloadCurrentPageData: false) svc_updateDataWhenReceiveNotification() // self.carouselContent.reloadData() } @objc func svc_updateRepoTag(noti: Notification) { svc_requestFetchTags(reloadCurrentPageData: false) svc_updateDataWhenReceiveNotification() // self.carouselContent.reloadData() } // MARK: - star / unstar repo action @objc func svc_starRepo(noti: Notification) { svc_updateDataWhenReceiveNotification() // self.carouselContent.reloadData() } @objc func svc_unstarRepo(noti: Notification) { svc_updateDataWhenReceiveNotification() // self.carouselContent.reloadData() } } ================================================ FILE: BeeFun/BeeFun/View/Stars/BFStarController+View.swift ================================================ // // BFStarController+View.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit extension BFStarController { // MARK: - view func svc_customViewBeforeGetTags() { svc_customNavView() svc_setupTableView() } func svc_customViewAfterGetTags() { svc_customTagBar() svc_customCarouselView() svc_customMoreButton() svc_customMoreView() } // MARK: - 导航栏选择 func svc_customNavView() { self.title = "Stars".localized self.automaticallyAdjustsScrollViewInsets = false self.leftItem?.isHidden = true navSegmentView = JSSegmentControl(titles: ["Stars".localized, "Watched".localized], frame: CGRect(x: 0, y: 0, w: 150, h: 30)) navSegmentView?.delegate = self self.navigationController?.navigationBar.topItem?.titleView = navSegmentView } // MARK: - tag栏 func svc_customTagBar() { let tagBarHeight: CGFloat = 35 // tagBar.sectionTitles = self.starTags tagBar.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width-tagBarHeight, height: tagBarHeight) tagBar.indexChangeBlock = { index in self.tagSegmentControlChange(index: index) } view.addSubview(tagBar) } // MARK: - carouse 内容视图 func svc_customCarouselView() { let scrollH = ScreenSize.height-uiTopBarHeight carouselContent.isHidden = false carouselContent.delegate = self carouselContent.dataSource = self carouselContent.type = .linear // carouselContent.isPagingEnabled = true carouselContent.scrollSpeed = 2.5 carouselContent.decelerationRate = 0.25 carouselContent.bounceDistance = 0.1 carouselContent.frame = CGRect(x: 0, y: tagBar.bottom, w: ScreenSize.width, h: scrollH-tagBar.height) // carouselContent.scrollToItem(at: 0, animated: true) view.addSubview(carouselContent) } // MARK: - 更多按钮 func svc_customMoreButton() { moreBtn.setImage(UIImage(named: "arrow_down_gray"), for: .normal) moreBtn.setImage(UIImage(named: "arrow_up_gray"), for: .highlighted) moreBtn.setImage(UIImage(named: "arrow_up_gray"), for: .selected) moreBtn.backgroundColor = UIColor.white moreBtn.addTarget(self, action: #selector(svc_clickMoreAction(sender:)), for: .touchUpInside) moreBtn.frame = CGRect(x: tagBar.right, y: tagBar.top, w: ScreenSize.width-tagBar.width, h: tagBar.height) view.addSubview(moreBtn) } // MARK: - 更多页面,显示全部tag按钮 @objc func svc_customMoreView() { moreView.frame = CGRect(x: 0, y: self.tagBar.bottom, w: ScreenSize.width, h: 0) // moreView.isHidden = true moreView.backgroundColor = UIColor.bfViewBackgroundColor view.addSubview(moreView) } // MARK: - 更多显示/隐藏视图动画 func svc_moreViewAnimation(show: Bool) { let timeInterval = 0.35 if show { UIView.animate(withDuration: timeInterval, animations: { self.moreView.frame = CGRect(x: 0, y: self.tagBar.bottom, w: ScreenSize.width, h: ScreenSize.height-uiTopBarHeight) self.moreView.setContentOffset(CGPoint.zero, animated: false) }) } else { UIView.animate(withDuration: timeInterval, animations: { self.moreView.frame = CGRect(x: 0, y: self.tagBar.bottom, w: ScreenSize.width, h: 0) self.moreView.setContentOffset(CGPoint.zero, animated: false) }) } } /// 页面退出时,more按钮恢复,more视图隐藏 func svc_moreViewDisappear() { moreBtn.isSelected = false svc_moreViewAnimation(show: false) } // MARK: - 全部标签按钮 func svc_addAllButtons() { if allButtons.count > 0 { allButtons.removeAll() moreView.removeAllSubViews() } for (index, tag) in starTags.enumerated() { let tagB = UIButton() tagB.tag = index tagB.setTitle(tag, for: .normal) tagB.setTitleColor(UIColor.black, for: .normal) tagB.setTitleColor(UIColor.bfRedColor, for: .selected) tagB.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) tagB.radius = 15.0 tagB.borderWidth = 1.0/UIScreen.main.scale tagB.tag = index tagB.borderColor = .bfRedColor tagB.backgroundColor = UIColor.white tagB.addTarget(self, action: #selector(svc_clickTagInMoreView(sender:)), for: .touchUpInside) allButtons.append(tagB) moreView.addSubview(tagB) } } func svc_layoutAllTagsButton() { svc_addAllButtons() let lineH: CGFloat = 50 /// 两个按钮之间的间距 let btnOutsideMargin: CGFloat = 5 /// 按钮内部两边的间距宽度 let btnInsideMargin: CGFloat = 20 /// 按钮的高度 let btnH: CGFloat = 30 /// 行间距 let rowsYMargin: CGFloat = (lineH-btnH)/2.0 /// 第一列距离边距的长度 let firstColumnXMargin: CGFloat = 10 for (index, btn) in allButtons.enumerated() { var lastF = CGRect.zero var nowY: CGFloat = 10 var nowX = firstColumnXMargin if index > 0 { lastF = allButtons[index-1].frame nowY = lastF.y nowX += lastF.x + lastF.width + btnOutsideMargin } var nowW: CGFloat = 0 if let tagsTitle = btn.currentTitle { nowW = tagsTitle.width(with: lineH, font: btn.titleLabel!.font) + btnInsideMargin } let nextX: CGFloat = nowX + nowW if nextX > ScreenSize.width { nowY += btnH + rowsYMargin nowX = firstColumnXMargin } let nowF = CGRect(x: nowX, y: nowY, w: nowW, h: btnH) btn.frame = nowF layoutAllTagButtonChagngeSelState() } if let lastFrame = allButtons.last?.frame { moreView.contentSize = CGSize(width: ScreenSize.width, height: lastFrame.y+lastFrame.height+100) } else { moreView.contentSize = carouselContent.frame.size } } func layoutAllTagButtonChagngeSelState() { let selindex = tagBar.selectedSegmentIndex for btn in allButtons { if let tag = btn.currentTitle { if selindex < tagBar.sectionTitles.count { if tagBar.sectionTitles[selindex] == tag { btn.isSelected = true btn.borderColor = .bfRedColor btn.backgroundColor = UIColor.white } else { btn.isSelected = false btn.borderColor = UIColor(hex: "#cccbcf")! btn.backgroundColor = UIColor(hex: "#f3f2f5") } } } } } // MARK: - watched table内容视图 func svc_setupTableView() { watchedTableView.frame = CGRect.zero watchedTableView.isHidden = true watchedTableView.dataSource = self watchedTableView.delegate = self watchedTableView.separatorStyle = .none watchedTableView.backgroundColor = UIColor.bfViewBackgroundColor watchedTableView.mj_header = refreshManager.header() watchedTableView.mj_footer = refreshManager.footer() refreshManager.delegate = self if #available(iOS 11, *) { watchedTableView.estimatedRowHeight = 0 watchedTableView.estimatedSectionHeaderHeight = 0 watchedTableView.estimatedSectionFooterHeight = 0 } view.addSubview(watchedTableView) let tabH = ScreenSize.height-uiTopBarHeight watchedTableView.frame = CGRect(x: 0, y: uiTopBarHeight, w: ScreenSize.width, h: tabH) } } ================================================ FILE: BeeFun/BeeFun/View/Stars/BFStarController.swift ================================================ // // BFStarController.swift // BeeFun // // Created by WengHengcong on 26/09/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import HMSegmentedControl import iCarousel class BFStarController: BFBaseViewController, JSSegmentControlProtocol, iCarouselDelegate, iCarouselDataSource { // MARK: - View var navSegmentView: JSSegmentControl? //导航栏选择 //tag选择 var clickTag: Bool = false var tagBar: HMSegmentedControl! = JSHMSegmentedBridge.segmentControl() //tag栏 //主内容区域 var carouselContent: iCarousel = iCarousel() var watchedTableView = UITableView() //更多 var moreBtn = UIButton() var moreView = UIScrollView() var allButtons: [UIButton] = [] var lastContentIndex: Int = 0 var watchPageVal = 1 var watchPerpage = 15 var sortVal: String = "created" var directionVal: String = "desc" var tagFilter: TagFilter = TagFilter() // MARK: - Data var starTags: [String] = [] var watchsData: [ObjRepos] = [] // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() svc_requestFetchTags(reloadCurrentPageData: true) svc_customViewBeforeGetTags() svc_registerNotification() reloadViewClosure = { [weak self] (reachable) in self?.changeNavSegmentControl(index: (self?.navSegmentView!.selIndex)!) } loginViewClosure = { [weak self] (login) in self?.changeNavSegmentControl(index: (self?.navSegmentView!.selIndex)!) } _ = checkCurrentLoginState() _ = checkCurrentNetworkState() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) svc_moreViewDisappear() } deinit { NotificationCenter.default.removeObserver(self) } // MARK: - fetch data // 各种通知过来重新刷新数据:登录后、删除tag、更新tag func svc_updateDataWhenReceiveNotification() { if checkCurrentLoginState() { watchedTableView.mj_footer.isHidden = false if navSegmentView?.selIndex == 0 { currentContentReloadTagsRepos(force: true) } else { svc_getWatchedReposRequest(watchPageVal) } } else { //加载未登录的页面 watchedTableView.mj_footer.isHidden = true } } // MARK: - Action /// 点击更多按钮 @objc func svc_clickMoreAction(sender: UIButton) { sender.isSelected = !sender.isSelected svc_moreViewAnimation(show: sender.isSelected) } /// 点击更多视图中的某个标签 @objc func svc_clickTagInMoreView(sender: UIButton) { svc_layoutAllTagsButton() svc_moreViewAnimation(show: false) moreBtn.isSelected = false let index = sender.tag tagBar.setSelectedSegmentIndex(UInt(index), animated: true) carouselContent.scrollToItem(at: index, animated: true) } } // MARK: - Refresh extension BFStarController { override func headerRefresh() { watchedTableView.mj_header.endRefreshing() watchPageVal = 1 svc_getWatchedReposRequest(watchPageVal) } override func footerRefresh() { watchedTableView.mj_footer.endRefreshing() watchPageVal += 1 svc_getWatchedReposRequest(watchPageVal) } } // MARK: - iCarousel extension BFStarController { func currentContentView() -> BFStarContentView? { let content = carouselContent.currentItemView as? BFStarContentView return content } func numberOfItems(in carousel: iCarousel) -> Int { return starTags.count } func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { var tag: String? if !self.starTags.isBeyond(index: index) { tag = self.starTags[index] } var contentView: BFStarContentView if tag != nil { contentView = BFStarContentView.init(frame: carouselContent.bounds, tag: tag!) } else { contentView = BFStarContentView.init(frame: carouselContent.bounds) } carousel.decelerationRate = 0.05 return contentView } func carouselDidEndScrollingAnimation(_ carousel: iCarousel) { carousel.decelerationRate = 0.05 let currentIndex = carousel.currentItemIndex // 如果是点击tag控件,则不需要改变tag index if !clickTag { if !tagBar.sectionTitles.isBeyond(index: currentIndex) { tagBar.setSelectedSegmentIndex(UInt(currentIndex), animated: true) } } clickTag = false currentContentReloadTagsRepos(force: (abs(lastContentIndex - currentIndex) > 2) ) } /// 重新加载tag页面数据 func currentContentReloadTagsRepos(force: Bool) { currentContentView()?.reloadNetworkData(force: force) } } // MARK: - SegmentControl extension BFStarController { /// 点击头部tags列表动作 func tagSegmentControlChange(index: Int) { self.clickTag = true self.carouselContent.scrollToItem(at: index, animated: true) } /// 点击导航栏segment control func selectedSegmentContrlol(segment: JSSegmentControl, index: Int) { if !checkCurrentLoginState() { watchsData.removeAll() carouselContent.reloadData() watchedTableView.reloadData() return } changeNavSegmentControl(index: index) if watchsData.isEmpty { svc_getWatchedReposRequest(watchPageVal) } } func changeNavSegmentControl(index: Int) { let watchViewHidden = index == 0 ? true : false watchedTableView.isHidden = watchViewHidden tagBar.isHidden = !watchViewHidden moreBtn.isHidden = !watchViewHidden moreView.isHidden = !watchViewHidden carouselContent.isHidden = !watchViewHidden } } // MARK: - TableViewdatasource extension BFStarController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return watchsData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellId = "BFRepositoryTypeOneCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeThirdCell if cell == nil { cell = (BFRepositoryTypeThirdCell.cellFromNibNamed("BFRepositoryTypeThirdCell") as? BFRepositoryTypeThirdCell) } cell?.setBothEndsLines(row, all: watchsData.count) let repos = self.watchsData[row] cell!.objRepos = repos return cell! } } // MARK: - Tableview delegate extension BFStarController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 85 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) if !self.watchsData.isBeyond(index: indexPath.row) { let repos = self.watchsData[indexPath.row] JumpManager.shared.jumpReposDetailView(repos: repos, from: .star) } } } extension BFStarController { /// 占位图代理 override func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } } ================================================ FILE: BeeFun/BeeFun/View/Stars/ViewCell/BFStarViewModel.swift ================================================ // // NewStarViewModel.swift // BeeFun // // Created by WengHengcong on 23/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFStarViewModel: NSObject { } ================================================ FILE: BeeFun/BeeFun/View/Stars/ViewCell/JSSegmentControl.swift ================================================ // // JSSegmentControl.swift // BeeFun // // Created by WengHengcong on 2017/5/11. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit protocol JSSegmentControlProtocol: class { func selectedSegmentContrlol(segment: JSSegmentControl, index: Int) } /// 导航栏横滑的segment control class JSSegmentControl: UIView { /// 初始化的时候,不调用didSet var titles: [String] { didSet { didSetSegmentTitles() } } var selIndex: Int = 0 var backgroundImage: UIImageView = UIImageView(image: UIImage(named: "nav_seg_nor")) var segButtons: [UIButton]? weak var delegate: JSSegmentControlProtocol? override init(frame: CGRect) { self.titles = [] super.init(frame: frame) segmentViewInit() } convenience init(titles: [String]) { self.init(titles: titles, frame: CGRect.zero) } convenience init(titles: [String], frame: CGRect) { self.init(frame: frame) // 注意:初始化的时候,不调用didSet self.titles = titles didSetSegmentTitles() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func segmentViewInit() { self.addSubview(backgroundImage) backgroundImage.frame = self.frame } func didSetSegmentTitles() { assert(!self.titles.isEmpty, "titles can't empty") segButtons = [] for (index, title) in titles.enumerated() { let segBtn = UIButton() segBtn.tag = index segBtn.setTitle(title, for: .normal) segBtn.setTitle(title, for: .highlighted) segBtn.setTitleColor(UIColor.white, for: .normal) segBtn.setTitleColor(UIColor.bfRedColor, for: .selected) segBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) segBtn.titleLabel?.adjustFontSizeToFitWidth(minScale: 0.5) segBtn.setBackgroundImage(UIImage(named: "nav_seg_sel"), for: .selected) segBtn.setBackgroundImage(UIImage(named: "nav_seg_sel"), for: .highlighted) segBtn.addTarget(self, action: #selector(didSelectedSegment(sender:)), for: .touchUpInside) segButtons?.append(segBtn) self.addSubview(segBtn) } self.segButtons?.first?.isSelected = true setNeedsDisplay() } override func layoutSubviews() { if !self.titles.isEmpty && self.segButtons != nil && !(self.segButtons?.isEmpty)! { let btnW = self.width/CGFloat(self.titles.count) for index in titles.indices { let segBtn = self.segButtons![index] segBtn.frame = CGRect(x: CGFloat(index) * btnW, y: 0, w: btnW, h: self.height) } } } @objc func didSelectedSegment(sender: UIButton) { if sender.isKind(of: UIButton.self) { let tag = sender.tag for segBtn: UIButton in self.segButtons! { segBtn.isSelected = (segBtn.tag == tag) ? true : false } selIndex = tag self.delegate?.selectedSegmentContrlol(segment: self, index: selIndex) } } } ================================================ FILE: BeeFun/BeeFun/View/Tag/BFUpdateTagsController.swift ================================================ // // BFUpdateTagsController.swift // BeeFun // // Created by WengHengcong on 28/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import ObjectMapper class BFUpdateTagsController: BFBaseViewController { var repoModel: ObjRepos? /// repoModel原来的tag列表 var oriStatTags: [String]? /// 已添加tags var workingTags: [String] = [] /// 缓存的tags:alltags-workingtags var stashTags: [String] = [] /// 所有的tags var allTags: [String] = [] var workingTagsView = UIView() var workingButtongs: [UIButton] = [] var allTagsView = UIScrollView() var allButtons: [UIButton] = [] /// 输入新tag let inputNewViewTag = 2222 var inputNewTagView: UITextField = UITextField() var inputWillShowText: String? = "" var showAllTagLabel = UILabel() var tagFilter: TagFilter = TagFilter() let lineH: CGFloat = 50 /// 弹出浮窗的tag值 let popupViewTag = 1000 /// 需要移除的index var removeWorkingIndex: Int = 0 var tagsValueChanged: Bool = false // MARK: - life cycle override func viewDidLoad() { super.viewDidLoad() title = "Tags".localized rightItem?.setTitle("Save".localized, for: .normal) rightItem?.isHidden = false utc_loadTags() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) removePopView(sender: nil) } // MARK: - 导航栏 override func leftItemAction(_ sender: UIButton?) { if workingTags == oriStatTags { tagsValueChanged = false } else { tagsValueChanged = true } if tagsValueChanged { let alertController = UIAlertController(title: "Save Tags?".localized, message: nil, preferredStyle: .alert) let cancelAction = UIAlertAction(title: "Cancel".localized, style: .cancel) { (_) in _ = self.navigationController?.popViewController(animated: true) } alertController.addAction(cancelAction) let savelAction = UIAlertAction(title: "Save".localized, style: .default) { (_) in self.saveReposToDatabase() } alertController.addAction(savelAction) self.present(alertController, animated: true, completion: { }) return } _ = self.navigationController?.popViewController(animated: true) } /// 保存 override func rightItemAction(_ sender: UIButton?) { saveReposToDatabase() } // MARK: - data func utc_loadTags() { if let owner = UserManager.shared.login { tagFilter.owner = owner } tagFilter.page = 1 tagFilter.pageSize = 100000 tagFilter.sord = "desc" tagFilter.sidx = "name" var dict: [String: Any] = [:] do { dict = try JSONSerialization.jsonObject(with: try JSONEncoder().encode(tagFilter), options: []) as! [String: Any] } catch { print("tag filter is error") } BeeFunProvider.sharedProvider.request(BeeFunAPI.getAllTags(filter: dict) ) { (result) in switch result { case let .success(response): do { if let allTag: GetAllTagResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = allTag.codeEnum, code == BFStatusCode.bfOk { if let data = allTag.data { DispatchQueue.main.async { self.handleGetAllTagsRequestResponse(data: data) } } } } } catch { } case .failure: break } } } func handleGetAllTagsRequestResponse(data: [ObjTag]) { allTags.removeAll() for tagObj in data { if let tagName = tagObj.name { allTags.append(tagName) } } if let model = repoModel { if let tags = model.star_tags { workingTags = tags } } //针对all tag进行隐藏 allTags.removeAll("All".localized) workingTags.removeAll("All".localized) stashTags = allTags.difference(workingTags) tagsViewInit() } /// 保存数据 func saveReposToDatabase() { if repoModel != nil { //交集 //如果原来repo tag列表为空,那么强制赋空 if oriStatTags == nil { oriStatTags = [] } var change = true if oriStatTags == workingTags { change = false } var delTags = oriStatTags!.difference(workingTags) var addTags = workingTags.difference(oriStatTags!) var star_tagsStr = "" for (index, tagName) in workingTags.enumerated() { if index == 0 { star_tagsStr = tagName } else { star_tagsStr += ",\(tagName)" } } if let repoid = repoModel?.id { BeeFunProvider.sharedProvider.request(BeeFunAPI.addTagToRepo(change: change, star_tags: star_tagsStr, delete_tags: delTags, repoId: repoid)) { (result) in switch result { case let .success(response): do { if let allTag: BeeFunResponseModel = Mapper().map(JSONObject: try response.mapJSON()) { if let code = allTag.codeEnum, code == BFStatusCode.bfOk { NotificationCenter.default.post(name: NSNotification.Name.BeeFun.RepoUpdateTag, object: nil, userInfo: ["star_tags": self.workingTags]) _ = self.navigationController?.popViewController(animated: true) } else { JSMBHUDBridge.showError("Update Failure".localized) } } } catch { } case .failure: break } } } } } func makeNewTagObj(name: String) -> ObjTag { let tag = ObjTag() if !name.isEmpty { tag.name = name tag.owner = UserManager.shared.login } return tag } // MARK: - view func tagsViewInit() { workingTagsView.frame = CGRect(x: 0, y: uiTopBarHeight, w: ScreenSize.width, h: lineH) view.addSubview(workingTagsView) allTagsView.backgroundColor = UIColor(hex: "#f0eff3") view.addSubview(allTagsView) inputNewTagView.placeholder = "input tag".localized inputNewTagView.font = UIFont.bfSystemFont(ofSize: 17.0) inputNewTagView.textColor = UIColor.bfRedColor inputNewTagView.tag = inputNewViewTag inputNewTagView.delegate = self // inputNewTagView.clearButtonMode = .always inputNewTagView.returnKeyType = .done workingTagsView.addSubview(inputNewTagView) layoutAllView() } // MARK: - 添加按钮 func addWorkingButtons() { if workingButtongs.count > 0 { workingButtongs.removeAll() for view in workingTagsView.subviews where view.tag != inputNewViewTag { view.removeFromSuperview() } } for (index, tag) in workingTags.enumerated() { let tagB = UIButton() tagB.tag = index tagB.setTitle(tag, for: .normal) tagB.setTitleColor(UIColor.bfRedColor, for: .normal) tagB.setTitleColor(UIColor.white, for: .selected) tagB.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) tagB.radius = 15.0 tagB.borderWidth = 1.0/UIScreen.main.scale tagB.borderColor = .bfRedColor tagB.tag = index tagB.addTarget(self, action: #selector(workingButtonTouchAction(sender:)), for: .touchUpInside) workingButtongs.append(tagB) workingTagsView.addSubview(tagB) } } func addInputTextField() { if !workingTagsView.subviews.contains(inputNewTagView) { workingTagsView.addSubview(inputNewTagView) } } func addAllButtons() { if allButtons.count > 0 { allButtons.removeAll() allTagsView.removeAllSubViews() } showAllTagLabel.text = "All Tags".localized showAllTagLabel.font = UIFont.bfSystemFont(ofSize: 15.0) showAllTagLabel.textColor = UIColor(hex: "#8b9693") allTagsView.addSubview(showAllTagLabel) for (index, tag) in allTags.enumerated() { let tagB = UIButton() tagB.tag = index tagB.setTitle(tag, for: .normal) tagB.setTitleColor(UIColor.black, for: .normal) tagB.setTitleColor(UIColor.bfRedColor, for: .selected) tagB.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) tagB.radius = 15.0 tagB.borderWidth = 1.0/UIScreen.main.scale tagB.tag = index tagB.addTarget(self, action: #selector(allButtonTouchAction(sender:)), for: .touchUpInside) allButtons.append(tagB) allTagsView.addSubview(tagB) } } // MARK: - 布局按钮 func layoutAllView() { addWorkingButtons() addInputTextField() addAllButtons() //包含布局input text field layoutWorkingButtons() layoutAllButtons() } func layoutWorkingButtons() { /// 两个按钮之间的间距 let btnOutsideMargin: CGFloat = 5 /// 按钮内部两边的间距宽度 let btnInsideMargin: CGFloat = 20 /// 按钮的高度 let btnH: CGFloat = 30 /// 行间距 let rowsYMargin: CGFloat = (lineH-btnH)/2.0 /// 第一列距离边距的长度 let firstColumnXMargin: CGFloat = 10 for (index, btn) in workingButtongs.enumerated() { var lastF = CGRect.zero var nowY: CGFloat = rowsYMargin var nowX = firstColumnXMargin if index != 0 { lastF = workingButtongs[index-1].frame nowY = lastF.y nowX += lastF.x + lastF.width + btnOutsideMargin } var nowW: CGFloat = 0 if let tagsTitle = btn.currentTitle { nowW = tagsTitle.width(with: lineH, font: btn.titleLabel!.font) + btnInsideMargin } let nextX: CGFloat = nowX + nowW if nextX > ScreenSize.width { nowY += btnH + rowsYMargin nowX = firstColumnXMargin } let nowF = CGRect(x: nowX, y: nowY, w: nowW, h: btnH) btn.frame = nowF } let lastTagFrame = workingButtongs.last?.frame ?? CGRect.zero let inputTextH = lineH var inputTextW: CGFloat = 80 if let inputTagName = inputWillShowText { let newWidth = inputTagName.width(with: inputTextH, font: inputNewTagView.font!) if newWidth > 80 { inputTextW = newWidth + 40 } } var inputTextY = lastTagFrame.y-10 var inputTextX = lastTagFrame.x + lastTagFrame.width + 10.0 let inputRight = inputTextX + inputTextW if inputRight > ScreenSize.width { inputTextX = firstColumnXMargin inputTextY = lastTagFrame.y + lineH-10 inputTextW = ScreenSize.width } if inputTextY < 0 { inputTextY = 0 } // inputNewTagView.backgroundColor = UIColor.red inputNewTagView.frame = CGRect(x: inputTextX, y: inputTextY, w: inputTextW, h: inputTextH) workingTagsView.frame = CGRect(x: 0, y: uiTopBarHeight, w: ScreenSize.width, h: inputNewTagView.y+inputTextH) } func layoutAllButtons() { /// 两个按钮之间的间距 let btnOutsideMargin: CGFloat = 5 /// 按钮内部两边的间距宽度 let btnInsideMargin: CGFloat = 20 /// 按钮的高度 let btnH: CGFloat = 30 /// 行间距 let rowsYMargin: CGFloat = (lineH-btnH)/2.0 /// 第一列距离边距的长度 let firstColumnXMargin: CGFloat = 10 let showLabelH: CGFloat = 35 for (index, btn) in allButtons.enumerated() { var lastF = CGRect.zero var nowY: CGFloat = showLabelH var nowX = firstColumnXMargin if index != 0 { lastF = allButtons[index-1].frame nowY = lastF.y nowX += lastF.x + lastF.width + btnOutsideMargin } var nowW: CGFloat = 0 if let tagsTitle = btn.currentTitle { nowW = tagsTitle.width(with: lineH, font: btn.titleLabel!.font) + btnInsideMargin } let nextX: CGFloat = nowX + nowW if nextX > ScreenSize.width { nowY += btnH + rowsYMargin nowX = firstColumnXMargin } let nowF = CGRect(x: nowX, y: nowY, w: nowW, h: btnH) btn.frame = nowF if let tag = btn.currentTitle { if workingTags.contains(tag) { btn.isSelected = true btn.borderColor = .bfRedColor btn.backgroundColor = UIColor.white } else { btn.isSelected = false btn.borderColor = UIColor(hex: "#cccbcf")! btn.backgroundColor = UIColor(hex: "#f3f2f5") } } } showAllTagLabel.frame = CGRect(x: 10, y: 0, w: ScreenSize.width, h: showLabelH) allTagsView.frame = CGRect(x: 0, y: workingTagsView.bottom, w: ScreenSize.width, h: ScreenSize.height-showAllTagLabel.bottom) if let lastFrame = allButtons.last?.frame { allTagsView.contentSize = CGSize(width: ScreenSize.width, height: lastFrame.y+lastFrame.height+100) } else { allTagsView.contentSize = allTagsView.frame.size } } // MARK: - 所有标签按钮点击动作 /// 点击所有标签按钮的动作 @objc func allButtonTouchAction(sender: UIButton) { sender.isSelected = !sender.isSelected if sender.isSelected { sender.borderColor = .bfRedColor sender.backgroundColor = UIColor.white addTagToWorkArea(sender: sender) } else { sender.borderColor = UIColor(hex: "#cccbcf")! sender.backgroundColor = UIColor(hex: "#f3f2f5") removeTagFromWorkArea(sender: sender) } } /// 将tag移入工作区 func addTagToWorkArea(sender: UIButton) { if let newTag = sender.currentTitle { workingTags.append(newTag) layoutAllView() } } /// 将tag移出工作区 func removeTagFromWorkArea(sender: UIButton) { if let newTag = sender.currentTitle { workingTags.removeAll(newTag) layoutAllView() } } // MARK: - 工作区按钮动作 /// 点击工作区标签按钮的动作 @objc func workingButtonTouchAction(sender: UIButton) { //按钮本身置换颜色 //选中:背景红色,文字白色 //未选中:背景白色,文字红色 sender.isSelected = !sender.isSelected for btn in workingButtongs where btn != sender { btn.isSelected = false btn.backgroundColor = UIColor.white } if sender.isSelected { sender.backgroundColor = UIColor.bfRedColor addPopView(sender: sender) } else { sender.backgroundColor = UIColor.white removePopView(sender: sender) } } func addPopView(sender: UIButton) { // 移除其他按钮上面的小浮窗 for btn in workingButtongs where btn != sender { removePopView(sender: btn) } removeWorkingIndex = sender.tag //弹出小浮窗 let popBtn = UIButton() popBtn.setTitle("Delete".localized, for: .normal) popBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 13.0) popBtn.setTitleColor(UIColor.white, for: .normal) popBtn.setBackgroundImage(UIImage(named: "tag_pop"), for: .normal) popBtn.titleEdgeInsets = UIEdgeInsets(top: -8, left: 0, bottom: 0, right: 0) popBtn.addTarget(self, action: #selector(removeTagTouchAction(sender:)), for: .touchUpInside) let w: CGFloat = 50 let h: CGFloat = 50 let x = sender.centerX - w/2.0 let y = sender.y+uiTopBarHeight-h popBtn.frame = CGRect(x: x, y: y, w: w, h: h) popBtn.tag = popupViewTag UIApplication.shared.keyWindow?.addSubview(popBtn) } func removePopView(sender: UIButton?) { if let pop = UIApplication.shared.keyWindow?.viewWithTag(popupViewTag) { pop.removeFromSuperview() } } /// 小浮窗移除tag @objc func removeTagTouchAction(sender: UIButton) { sender.removeFromSuperview() if !workingButtongs.isBeyond(index: removeWorkingIndex) { removeTagFromWorkArea(sender: workingButtongs[removeWorkingIndex]) } } } extension BFUpdateTagsController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { removePopView(sender: nil) if range.length == 1 && string.length == 0 { //按了删除键,且UITextField还有字符 return true } if textField.text != nil && !textField.text!.isEmpty { inputWillShowText = textField.text! + string } else { inputWillShowText = string } layoutAllView() return true } func keyboardInputShouldDelete(_ textField: UITextField) -> Bool { removePopView(sender: nil) if textField.text == nil || textField.text!.isEmpty { //按了删除键,UITextField无字符 if workingTags.count > 0 && !workingTags.isEmpty { workingTags.removeLast() layoutAllView() } } return true } func textFieldShouldReturn(_ textField: UITextField) -> Bool { removePopView(sender: nil) saveWorktagsSuccessful() return true } func saveWorktagsSuccessful() { if checkTagsInDatabase() { //将其tag加到working tags区域,并重新刷新布局 if let newTag = inputNewTagView.text?.trimmed { workingTags.append(newTag) inputNewTagView.text = nil layoutAllView() } } } func checkTagsInDatabase() -> Bool { inputNewTagView.endEditing(true) //1. 先检查text是否为空 if inputNewTagView.text != nil && !inputNewTagView.text!.isEmpty { //2. 是否存在该tag if let tagName = inputNewTagView.text?.trimmed { if allTags.contains(tagName) { JSMBHUDBridge.showError("Already exists!".localized, view: self.view) return false } else { return true } } else { return false } } else { JSMBHUDBridge.showError("No tag to save".localized, view: self.view) return false } } } ================================================ FILE: BeeFun/BeeFun/View/Tag/ListView/ListScrollView.swift ================================================ // // ListScrollView.swift // BeeFun // // Created by WengHengcong on 2017/5/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class ListScrollView: UIView, UITableViewDataSource, UITableViewDelegate { let cellID = "ListCellIdentifier" /// list列表数据源 var lists: [ String ] = [] { didSet { reload() } } /// 可能没有选中,默认选中第一个并不合适 var selIndex: Int? var listTableView = UITableView() override init(frame: CGRect) { super.init(frame: frame) addSubview(listTableView) backgroundColor = UIColor.bfViewBackgroundColor listTableView.delegate = self listTableView.dataSource = self listTableView.separatorStyle = .none // listTableView.backgroundColor = UIColor.bfViewBackgroundColor if #available(iOS 11, *) { listTableView.estimatedRowHeight = 0 listTableView.estimatedSectionHeaderHeight = 0 listTableView.estimatedSectionFooterHeight = 0 } listTableView.register(UITableViewCell.self, forCellReuseIdentifier:cellID) } convenience init() { self.init(frame: CGRect.zero) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func reload() { listTableView.reloadData() } override func layoutSubviews() { super.layoutSubviews() listTableView.frame = CGRect(x: 0, y: 0, w: frame.width, h: frame.height) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return lists.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) cell.backgroundColor = UIColor.white cell.textLabel?.textColor = UIColor.black // cell.textLabel?.numberOfLines = 0 cell.textLabel!.font = UIFont.bfSystemFont(ofSize: 17.0) cell.textLabel?.adjustFontSizeToFitWidth(minScale: 0.5) cell.addBorderSingle(UIColor.bfLineBackgroundColor, width: 0.5, at: .bottom) cell.addBorderSingle(UIColor.bfLineBackgroundColor, width: 0.5, at: .right) if selIndex != nil && indexPath.row == selIndex { cell.backgroundColor = UIColor.hex("e2e2e2", alpha: 1.0) cell.removeBorder(.right) cell.textLabel?.textColor = UIColor.bfRedColor } cell.textLabel?.text = lists[indexPath.row] return cell } //delegate func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return designBy4_7Inch(40) } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { selIndex = indexPath.row reload() } } ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/AddTagsCell.swift ================================================ // // AddTagsCell.swift // BeeFun // // Created by WengHengcong on 02/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class AddTagsCell: BFBaseCell { @IBOutlet weak var textLbl: UILabel! @IBOutlet weak var addImageV: UIImageView! var showtext: String? { didSet { textLbl.text = showtext } } override func p_customCellView() { super.p_customCellView() let w: CGFloat = 20 let y = (self.height-w)/2 addImageV.frame = CGRect(x: 10, y: y, w: w, h: w) let txtX = addImageV.right + 15 textLbl.frame = CGRect(x: txtX, y: 0, w: ScreenSize.width-txtX, h: self.height) } override func setSelected(_ selected: Bool, animated: Bool) { } override func setHighlighted(_ highlighted: Bool, animated: Bool) { } } ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/AddTagsCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/JSScrollContentView.swift ================================================ // // JSScrollContentView.swift // BeeFun // // Created by WengHengcong on 23/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit import MJRefresh import iCarousel @objc protocol JSScrollContentProtocol: class { @objc optional func scrollContentViewDidScroll(scrollContent: JSScrollContentView, displayTableView: UITableView) @objc optional func scrollContentViewRefresh(scrollContent: JSScrollContentView) @objc optional func scrollContentViewLoadMore(scrollContent: JSScrollContentView) @objc optional func scrollContentViewDidSeletedTagBarItem(scrollContent: JSScrollContentView, tagBar: JSTagBar, item: JSTagItem, index: Int) @objc optional func scrollContentViewDidSeletedTagBarMore(scrollContent: JSScrollContentView, tagBar: JSTagBar) } class JSScrollContentView: UIView, JSTagBarTouchProtocol, iCarouselDataSource, iCarouselDelegate { var controller: BFBaseViewController? var titles: [String]? { didSet { tagBar?.titles = titles! } } var carousel: iCarousel = iCarousel() var tagBar: JSTagBar? var selIndex: Int = 0 { didSet { tagBar?.currentIndex = selIndex //滑动scroll content } } var displayTableView: UITableView? private let tagBarHeight: CGFloat = 40 var delegat: JSScrollContentProtocol? override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } convenience init(frame: CGRect, titles: [String], controller: BFBaseViewController) { self.init(frame: frame) self.controller = controller self.titles = titles customSubViews() } deinit { } func customSubViews() { customTagBar() customContentView() } func customTagBar() { tagBar = JSTagBar() tagBar?.frame = CGRect(x: 0, y: 0, width: self.width, height: tagBarHeight) tagBar?.delegate = self if titles != nil { tagBar?.titles = titles! } tagBar?.currentIndex = 0 self.addSubview(tagBar!) } func customContentView() { assert(titles != nil, "scroll content view titles can't be nil") assert(!(titles!.isEmpty), "scroll content view titles can't be empty") carousel.delegate = self carousel.dataSource = self carousel.type = .coverFlow carousel.frame = CGRect(x: 0, y: tagBarHeight, w: self.width, h: self.height-tagBarHeight) addSubview(carousel) } override func layoutSubviews() { super.layoutSubviews() } // MARK: - carousel func numberOfItems(in carousel: iCarousel) -> Int { if self.titles != nil { return self.titles!.count } return 0 } func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { let table = UITableView() table.frame = CGRect(x: 0, y: 0, w: self.width, h: self.height-tagBarHeight) table.dataSource = controller table.delegate = controller table.separatorStyle = .none table.backgroundColor = UIColor.bfViewBackgroundColor //滑动 table.mj_header = jsc_header() table.mj_footer = jsc_footer() // displayTableView = table if #available(iOS 11, *) { table.estimatedRowHeight = 0 table.estimatedSectionHeaderHeight = 0 table.estimatedSectionFooterHeight = 0 } return table } // MARK: - TagBar touch func touchIetm(item: JSTagItem, index: Int) { if tagBar != nil { self.delegat?.scrollContentViewDidSeletedTagBarItem?(scrollContent: self, tagBar: tagBar!, item: item, index: index) } } func touchMore(more: UIButton, expend: Bool) { if tagBar != nil { self.delegat?.scrollContentViewDidSeletedTagBarMore?(scrollContent: self, tagBar: tagBar!) } } // MARK: - Refresh func jsc_header() -> MJRefreshNormalHeader { let header = MJRefreshNormalHeader() header.lastUpdatedTimeLabel.isHidden = true header.stateLabel.isHidden = true header.setRefreshingTarget(self, refreshingAction:#selector(jsc_headerRefresh)) return header } func jsc_footer() -> MJRefreshAutoNormalFooter { let footer = MJRefreshAutoNormalFooter() footer.setRefreshingTarget(self, refreshingAction:#selector(jsc_footerRefresh)) footer.stateLabel.isHidden = true footer.isRefreshingTitleHidden = true return footer } @objc func jsc_headerRefresh() { displayTableView?.mj_header.endRefreshing() self.delegat?.scrollContentViewRefresh?(scrollContent: self) } @objc func jsc_footerRefresh() { displayTableView?.mj_footer.endRefreshing() self.delegat?.scrollContentViewLoadMore?(scrollContent: self) } } ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/JSTagBar.swift ================================================ // // TagScrollView.swift // BeeFun // // Created by WengHengcong on 2017/5/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit protocol JSTagBarTouchProtocol: class { func touchIetm(item: JSTagItem, index: Int) func touchMore(more: UIButton, expend: Bool) } class JSTagBar: UIView, UIScrollViewDelegate, JSTagItemTouchProtocol { var tagWidth: CGFloat = 50 weak var delegate: JSTagBarTouchProtocol? var titles: [String] = [] { didSet { createTagItems() } } var currentIndex: Int { set { setSelectedItem(index: currentIndex) } get { return selIndex } } fileprivate var selIndex: Int = 0 var tagItems: [JSTagItem] = [] { didSet { } } lazy var scrollView: UIScrollView = { let scroll = UIScrollView() // 是否支持滑动最顶端 // scrollView.scrollsToTop = false; scroll.delegate = self // 是否反弹 scroll.bounces = true // 是否分页 // scrollView.isPagingEnabled = true // 是否滚动 // scrollView.scrollEnabled = false; // 设置内容的边缘 // scrollView.contentInset = UIEdgeInsetsMake(0, 50, 50, 0); scroll.showsHorizontalScrollIndicator = false // 设置indicator风格 // scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; // scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 50, 0, 0); // 提示用户,Indicators flash // scrollView.flashScrollIndicators() // 是否同时运动,lock // scrollView.isDirectionalLockEnabled = true return scroll }() lazy var moreImage: UIButton = { let button = UIButton() button.setImage(UIImage(named:"arrow_down_gray"), for: .normal) button.setImage(UIImage(named:"arrow_up_gray"), for: .selected) button.addTarget(self, action: #selector(touchMore(sender:)), for: .touchUpInside) return button }() override init(frame: CGRect) { super.init(frame: frame) scrollViewInit() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func layoutSubviews() { super.layoutSubviews() let moreW: CGFloat = self.height let moreX = self.width - moreW moreImage.frame = CGRect(x: moreX, y: 0, w: moreW, h: self.height) let scroolW = self.width-moreW scrollView.frame = CGRect(x: 0, y: 0, w: scroolW, h: self.height) var allContentWidth: CGFloat = 0 for tagItem in self.tagItems { tagItem.frame = CGRect(x: allContentWidth, y: 0, w: tagItem.width, h: self.height) allContentWidth += tagItem.contentWidth } if allContentWidth >= scroolW { scrollView.contentSize = CGSize(width: allContentWidth, height: self.height) } } func scrollViewInit() { backgroundColor = UIColor.bfViewBackgroundColor addSubview(moreImage) let moreW: CGFloat = self.height let scroolW = self.width-moreW scrollView.frame = CGRect(x: 0, y: 0, w: scroolW, h: self.height) scrollView.contentSize = CGSize(width: self.width, height: self.height) addSubview(scrollView) } func createTagItems() { assert(!self.titles.isEmpty, "JSTagBar titles can't empty") for (index, title) in self.titles.enumerated() { let tagItem = JSTagItem(title: title) tagItem.tag = index tagItem.delegate = self tagItems.append(tagItem) scrollView.addSubview(tagItem) } currentIndex = 0 setNeedsDisplay() } /// 选中某一个Item /// /// - Parameters: /// - index: item的index func touchTag(sender: JSTagItem, index: Int) { for tagItem in self.tagItems where tagItem.tag != index { //选中的不是当前选中的 tagItem.setTagUnselected() } selIndex = index self.delegate?.touchIetm(item: sender, index: index) } /// 选中More /// @objc func touchMore(sender: UIButton) { sender.isSelected = !sender.isSelected self.delegate?.touchMore(more: sender, expend: sender.isSelected) } func setSelectedItem(index: Int) { if self.tagItems.isEmpty || index < 0 { return } if !self.tagItems.isBeyond(index: index) { for tagItem in self.tagItems { if tagItem.tag != index { //选中的不是当前选中的 tagItem.setTagUnselected() } else { let item = self.tagItems[index] item.isSelected = true } } } } // 是否支持滑动至顶部 func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool { return false } // 滑动到顶部时调用该方法 func scrollViewDidScrollToTop(_ scrollView: UIScrollView) { print("scrollViewDidScrollToTop") } // scrollView 已经滑动 func scrollViewDidScroll(_ scrollView: UIScrollView) { print("scrollViewDidScroll") } // scrollView 开始拖动 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { print("scrollViewWillBeginDragging") } // scrollView 结束拖动 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { print("scrollViewDidEndDragging") } // scrollView 开始减速(以下两个方法注意与以上两个方法加以区别) func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) { print("scrollViewWillBeginDecelerating") } // scrollview 减速停止 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { print("scrollViewDidEndDecelerating") } } ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/JSTagItem.swift ================================================ // // JSTagItem.swift // BeeFun // // Created by WengHengcong on 14/05/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit protocol JSTagItemTouchProtocol: class { func touchTag(sender: JSTagItem, index: Int) } class JSTagItem: UIView { /// itme title var title: String? { didSet { setTitleAllState(title: title!) } } weak var delegate: JSTagItemTouchProtocol? var font: UIFont? = UIFont.bfSystemFont(ofSize: 15.0) { didSet { titleBtn.titleLabel?.font = font } } var align: NSTextAlignment? = .center { didSet { titleBtn.titleLabel?.textAlignment = align! } } var foreColor: UIColor? = .black { didSet { titleBtn.setTitleColor(foreColor, for: .normal) } } var backColor: UIColor? = .white { didSet { titleBtn.backgroundColor = backColor } } var attributeTitle: NSAttributedString? { didSet { titleBtn.titleLabel?.attributedText = attributeTitle } } var isSelected: Bool? = false { didSet { didSelectedTagButtion() } } var contentWidth: CGFloat { if self.title != nil { let width = self.title!.width(with: self.height, font: self.font!) return width+30 } return 0 } private lazy var titleBtn = UIButton() override init(frame: CGRect) { super.init(frame: frame) } convenience init(title: String?) { assert(title != nil, "JSTagItem title can't nil") self.init(title: title, frame: CGRect.zero) } convenience init(title: String?, frame: CGRect) { assert(title != nil, "JSTagItem title can't nil") self.init(frame: frame) //初始化View commonInitView() //设置标题 self.title = title setTitleAllState(title: title!) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func commonInitView() { setTitleColor(.black, for: .normal) setTitleColor(.bfRedColor, for: .highlighted) setTitleColor(.bfRedColor, for: .selected) titleBtn.addTarget(self, action: #selector(touchItem(sengder:)), for: .touchUpInside) // titleBtn.backgroundColor = UIColor.green self.addSubview(titleBtn) } override func layoutSubviews() { super.layoutSubviews() titleBtn.frame = CGRect(x: 0, y: 0, w: self.contentWidth, h: self.height) self.frame = CGRect(x: self.x, y: self.y, w: self.contentWidth, h: self.height) } func didSelectedTagButtion() { if isSelected != nil { touchItem(sengder: titleBtn) } } func setTitle(_ title: String?, for state: UIControl.State) { titleBtn.setTitle(title, for: state) } func setTitleColor(_ color: UIColor?, for state: UIControl.State) { titleBtn.setTitleColor(color, for: state) } func setImage(_ image: UIImage?, for state: UIControl.State) { titleBtn.setImage(image, for: state) } func setBackgroundImage(_ image: UIImage?, for state: UIControl.State) { titleBtn.setBackgroundImage(image, for: state) } func setAttributedTitle(_ title: NSAttributedString?, for state: UIControl.State) { titleBtn.setAttributedTitle(title, for: state) } func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event) { titleBtn.addTarget(target, action: action, for: controlEvents) } func setTitleAllState(title: String) { titleBtn.setTitle(title, for: .normal) titleBtn.setTitle(title, for: .highlighted) titleBtn.setTitle(title, for: .selected) } @objc func touchItem(sengder: UIButton) { if sengder.isKind(of: UIButton.self) { if sengder.isSelected { return } else { //选中 sengder.isSelected = true self.delegate?.touchTag(sender: self, index: self.tag) } } } func setTagUnselected() { titleBtn.isSelected = false } } ================================================ FILE: BeeFun/BeeFun/View/Tag/TagView/ShowTagsCell.swift ================================================ // // ShowTagsCell.swift // BeeFun // // Created by WengHengcong on 02/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// 预留,以后用语tags显示,像微信一样 class ShowTagsCell: BFSwipeCell { // 此后会修改样式,此处按最简单样式来 override func setSelected(_ selected: Bool, animated: Bool) { } override func setHighlighted(_ highlighted: Bool, animated: Bool) { } } ================================================ FILE: BeeFun/BeeFun/View/Trending/BFShowcaseDetailController.swift ================================================ // // BFShowcaseDetailController.swift // BeeFun // // Created by WengHengcong on 3/10/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh import ObjectMapper class BFShowcaseDetailController: BFBaseViewController { var showcaseInfoV: BFShowcaseHeaderView = BFShowcaseHeaderView.loadViewFromNib() var showcase: ObjShowcase! override func viewDidLoad() { self.title = showcase.name super.viewDidLoad() tsc_setupTableView() tsc_updateContentView() tsc_getShowcaseRequest() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func tsc_setupTableView() { refreshHidden = .all self.view.addSubview(showcaseInfoV) showcaseInfoV.frame = CGRect(x: 0, y: topOffset, w: ScreenSize.width, h: 121) self.view.addSubview(tableView) let tabY = showcaseInfoV.bottom + 15.0 let tabH = ScreenSize.height - tabY tableView.frame = CGRect(x: 0, y: tabY, w: ScreenSize.width, h: tabH) self.automaticallyAdjustsScrollViewInsets = false } func tsc_updateContentView() { showcaseInfoV.showcase = showcase self.tableView.reloadData() } // MARK: - Request /// func tsc_getShowcaseRequest() { if showcase.name == nil { return } let hud = JSMBHUDBridge.showHud(view: self.view) TrendingManager.shared.requestForTrendingShowcaseDetail(showcase: showcase.name!) { (repos) in DispatchQueue.main.async { hud.hide(animated: true) } if repos.isEmpty { return } self.showcase.repositories?.removeAll() self.showcase.repositories = repos self.tableView.reloadData() //self.tableView.setContentOffset(CGPoint.zero, animated:true) } } override func reconnect() { super.reconnect() tsc_getShowcaseRequest() } } extension BFShowcaseDetailController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if showcase.repositories == nil { return 0 } let reposCount = showcase.repositories!.count return reposCount } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellId = "BFRepositoryTypeThirdCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeThirdCell if cell == nil { cell = (BFRepositoryTypeThirdCell.cellFromNibNamed("BFRepositoryTypeThirdCell") as? BFRepositoryTypeThirdCell) } cell?.setBothEndsLines(row, all:self.showcase.repositories!.count) let repos = self.showcase.repositories![row] cell!.objRepos = repos return cell! } } extension BFShowcaseDetailController { // 顶部刷新 override func headerRefresh() { super.headerRefresh() } override func footerRefresh() { super.footerRefresh() } } extension BFShowcaseDetailController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 85 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let repos = self.showcase.repositories![indexPath.row] JumpManager.shared.jumpReposDetailView(repos: repos, from: .other) } } ================================================ FILE: BeeFun/BeeFun/View/Trending/BFTrendingController+Data.swift ================================================ // // BFTrendingController+Data.swift // BeeFun // // Created by WengHengcong on 25/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // import ObjectMapper import Alamofire extension BFTrendingController { // MARK: - 从plist中获取用语filter的数据 func tvc_getDataFromPlist() { if let path = Bundle.appBundle.path(forResource: "CPCity", ofType: "plist") { cityArr = NSArray(contentsOfFile: path)! as? [String] } if let path = Bundle.appBundle.path(forResource: "BFLanguage", ofType: "plist") { languageArr = NSArray(contentsOfFile: path)! as? [String] } if let path = Bundle.appBundle.path(forResource: "CPCountry", ofType: "plist") { countryArr = NSArray(contentsOfFile: path)! as? [String] } } // MARK: 获取repos数据 func tvc_getReposRequest() { requesDeveloperModel?.language = paraLanguage requesDeveloperModel?.time = BFGihubTrendingTimeEnum(rawValue: paraSince) _ = JSMBHUDBridge.showHud(view: self.view) BeeFunProvider.sharedProvider.request(BeeFunAPI.getGithubTrending(model: requesRepostModel!), callbackQueue: DispatchQueue.main, progress: { (progress) in print(progress.progress) }) { (result) in self.removeReloadView() JSMBHUDBridge.hideAllHudInView(view: self.view) switch result { case let .success(response): do { if let reposResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = reposResponse.codeEnum, code == BFStatusCode.bfOk { if let data = reposResponse.data { self.reposData.removeAll() self.reposData = data self.displayTableView?.reloadData() } } } } catch { } break case .failure: break } } } // MARK: 获取用户数据 func tvc_getUserRequest() { requesDeveloperModel?.language = paraLanguage requesDeveloperModel?.time = BFGihubTrendingTimeEnum(rawValue: paraSince) _ = JSMBHUDBridge.showHud(view: self.view) BeeFunProvider.sharedProvider.request(BeeFunAPI.getGithubTrending(model: requesDeveloperModel!)) { (result) in JSMBHUDBridge.hideAllHudInView(view: self.view) switch result { case let .success(response): do { if let reposResponse = Mapper().map(JSONObject: try response.mapJSON()) { if let code = reposResponse.codeEnum, code == BFStatusCode.bfOk { if let data = reposResponse.data { DispatchQueue.main.async { self.removeReloadView() self.devesData.removeAll() self.devesData = data self.displayTableView?.reloadData() } } } } } catch { } break case .failure: break } } } // MARK: 获取showcase数据 func tvc_getShowcasesRequest(page: Int) { _ = JSMBHUDBridge.showHud(view: self.view) TrendingManager.shared.requestForTrendingShowcase(page: page) { (showcase) in DispatchQueue.main.async { JSMBHUDBridge.hideAllHudInView(view: self.view) self.removeReloadView() if showcase.isEmpty { return } if page == 1 { self.showcasesData.removeAll() self.showcasesData = showcase } else { self.showcasesData += showcase } self.displayTableView?.reloadData() } } } } ================================================ FILE: BeeFun/BeeFun/View/Trending/BFTrendingController+View.swift ================================================ // // BFTrendingController+View.swift // BeeFun // // Created by WengHengcong on 25/06/2017. // Copyright © 2017 JungleSong. All rights reserved. // extension BFTrendingController { func tvc_initView() { tvc_addNaviBarButtonItem() tvc_setupSegmentView() tvc_setupFilterView() tvc_customCarouselView() } // MARK: - 导航栏 func tvc_addNaviBarButtonItem() { self.title = "Explore".localized self.leftItem?.isHidden = false self.leftItemImage = UIImage(named: "nav_funnel") self.leftItemSelImage = UIImage(named: "nav_funnel_sel") let backView = BFTrendingSearchBar(frame: CGRect(x: 0, y: 0, w: ScreenSize.width-80, h: 31)) let searchBtn = UIButton(frame: CGRect(x: 8, y: 0, w: ScreenSize.width-80, h: 31)) searchBtn.setTitle("Search repositories、users...".localized, for: .normal) searchBtn.setTitleColor(UIColor.iOS11MidGray, for: .normal) searchBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) searchBtn.titleLabel?.textAlignment = .left searchBtn.backgroundColor = UIColor.white searchBtn.layer.cornerRadius = 15.0 searchBtn.layer.masksToBounds = true searchBtn.addTarget(self, action: #selector(tvc_didClickSearchBar), for: .touchUpInside) backView.addSubview(searchBtn) navigationItem.titleView = backView } // MARK: - 筛选视图 func tvc_setupFilterView() { let firW: CGFloat = 100.0 let secW: CGFloat = self.view.width-firW filterView = CPFilterTableView(frame: CGRect(x: 0, y: 64-filterVHeight-10, width: self.view.width, height: filterVHeight)) filterView!.backgroundColor = UIColor.bfViewBackgroundColor filterView!.filterDelegate = self filterView!.coloumn = .two filterView!.rowWidths = [firW, secW] filterView!.rowHeights = [40.0, 40.0] filterView!.filterTypes = ["Language".localized] filterView!.filterData = [languageArr!] filterView?.filterViewInit() self.view.addSubview(filterView!) } // MARK: - 筛选视图 func tvc_filterViewApper() { if !filterView!.filterData.isEmpty { filterView!.filterTypes = ["Language".localized] filterView!.filterData = [languageArr!] } view.bringSubviewToFront(filterView!) filterView!.frame = CGRect(x: 0, y: uiTopBarHeight, width: self.view.width, height: filterVHeight) } func tvc_filterViewDisapper() { leftItem?.isSelected = false filterView!.frame = CGRect(x: 0, y: uiTopBarHeight-filterVHeight-10, width: self.view.width, height: filterVHeight) } // MARK: - carouse 内容视图 func tvc_customCarouselView() { let scroolY = 35.0+uiTopBarHeight let scroolH = ScreenSize.height-scroolY-3 carouselContent.isHidden = false carouselContent.delegate = self carouselContent.dataSource = self carouselContent.type = .linear // carouselContent.isPagingEnabled = true carouselContent.scrollSpeed = 2.5 carouselContent.decelerationRate = 0.25 carouselContent.bounceDistance = 0.1 carouselContent.frame = CGRect(x: 0, y: scroolY, w: ScreenSize.width, h: scroolH) // carouselContent.scrollToItem(at: 0, anim@objc ated: true) view.addSubview(carouselContent) } // MARK: - 标签选择视图 func tvc_setupSegmentView() { self.automaticallyAdjustsScrollViewInsets = false segControl.indexChangeBlock = { index in self.segmentControlChange(index: index) } self.view.addSubview(segControl) } } ================================================ FILE: BeeFun/BeeFun/View/Trending/BFTrendingController.swift ================================================ // // BFTrendingController.swift // BeeFun // // Created by wenghengcong on 15/12/30. // Copyright © 2015年 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh import HMSegmentedControl import iCarousel public enum TrendingViewPageType: String { case user case repos } class BFTrendingController: BFBaseViewController, iCarouselDataSource, iCarouselDelegate { //view var segControl: HMSegmentedControl! = JSHMSegmentedBridge.segmentControl(titles: ["Repositories".localized, "Developers".localized]) var filterView: CPFilterTableView? let filterVHeight: CGFloat = ScreenSize.height-uiTopBarHeight-uiTabBarHeight-35 //filterview height // MARK: data var requesRepostModel: BFGithubTrendingRequsetModel? var requesDeveloperModel: BFGithubTrendingRequsetModel? var showcasePage: Int = 1 var reposData: [BFGithubTrengingModel] = [] var devesData: [BFGithubTrengingModel] = [] var showcasesData: [ObjShowcase] = [] var cityArr: [String]? var countryArr: [String]? var languageArr: [String]? // MARK: - request parameters var lastSegmentIndex = 0 var paraSince: String = "daily" var paraLanguage: String = "all" //carousel let tableTag = 5000 var carouselContent: iCarousel = iCarousel() var clickTag: Bool = false var currentIndex: Int { return carouselContent.currentItemIndex } var displayTableView: UITableView? { if let vw = carouselContent.currentItemView { if let table = vw.viewWithTag(tableTag) as? UITableView { return table } } return nil } // MARK: - view cycle override func viewDidLoad() { super.viewDidLoad() needLogin = false tvc_getDataFromPlist() tvc_initView() tvc_updateNetrokData() reloadViewClosure = { [weak self] (reachable) in self?.carouselContent.isHidden = !reachable } loginViewClosure = { [weak self] (login) in self?.carouselContent.isHidden = !login } //只有在首次启动时才弹窗,确保只弹一次窗 _ = checkCurrentNetworkState() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if segControl.selectedSegmentIndex == 0 && reposData.count == 0 { tvc_getReposRequest() } else if segControl.selectedSegmentIndex == 1 && devesData.count == 0 { tvc_getUserRequest() } else if segControl.selectedSegmentIndex == 2 && showcasesData.count == 0 { tvc_getShowcasesRequest(page: showcasePage) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) tvc_filterViewDisapper() } // MARK: - action override func leftItemAction(_ sender: UIButton?) { let btn = sender! btn.isSelected = !btn.isSelected if btn.isSelected { tvc_filterViewApper() } else { tvc_filterViewDisapper() } } func segmentControlChange(index: Int) { displayTableView?.reloadData() //请求 if index == 0 && reposData.isEmpty { tvc_getReposRequest() } else if index == 1 && devesData.isEmpty { tvc_getUserRequest() } else if index == 2 && showcasesData.isEmpty { tvc_getShowcasesRequest(page: showcasePage) } //筛选按钮是否显示 self.leftItem?.isHidden = index == 0 || index == 1 ? false : true self.clickTag = true self.carouselContent.scrollToItem(at: index, animated: true) } @objc func tvc_didClickSearchBar() { let searchVC = SESearchViewController() searchVC.hidesBottomBarWhenPushed = true navigationController?.pushViewController(searchVC, animated: true) } /// 加载数据 func tvc_updateNetrokData() { requesRepostModel = BFGithubTrendingRequsetModel() requesDeveloperModel = BFGithubTrendingRequsetModel() let source = 2 requesRepostModel?.type = 1 requesRepostModel?.source = source requesRepostModel?.time = BFGihubTrendingTimeEnum.daily requesRepostModel?.language = paraLanguage requesRepostModel?.page = 1 requesRepostModel?.perpage = 100 requesRepostModel?.sort = "up_star_num" requesRepostModel?.direction = "desc" requesDeveloperModel?.type = 2 requesDeveloperModel?.source = source requesDeveloperModel?.time = BFGihubTrendingTimeEnum.daily requesDeveloperModel?.language = paraLanguage requesDeveloperModel?.page = 1 requesDeveloperModel?.perpage = 100 requesDeveloperModel?.sort = "pos" requesDeveloperModel?.direction = "asc" if segControl.selectedSegmentIndex == 0 { tvc_getReposRequest() } else if segControl.selectedSegmentIndex == 1 { tvc_getUserRequest() } else { tvc_getShowcasesRequest(page: showcasePage) } } override func reconnect() { super.reconnect() tvc_updateNetrokData() } override func request() { super.request() tvc_updateNetrokData() } override func didAction(place: BFPlaceHolderView) { if place == placeEmptyView { request() } else if place == placeLoginView { login() } else if place == placeReloadView { self.request() } } } // MARK: - iCarousel extension BFTrendingController { func numberOfItems(in carousel: iCarousel) -> Int { return segControl.sectionTitles.count } //1. 先获取view func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { var reuseView: UIView var reuseTable: UITableView if let vw = view { reuseView = vw } else { reuseTable = UITableView() reuseTable.frame = CGRect.zero reuseTable.dataSource = self reuseTable.delegate = self reuseTable.separatorStyle = .none reuseTable.scrollsToTop = true reuseTable.backgroundColor = UIColor.bfViewBackgroundColor reuseTable.mj_header = refreshManager.header() reuseTable.mj_footer = refreshManager.footer() if #available(iOS 11, *) { reuseTable.estimatedRowHeight = 0 reuseTable.estimatedSectionHeaderHeight = 0 reuseTable.estimatedSectionFooterHeight = 0 } refreshManager.delegate = self reuseTable.frame = CGRect(x: 0, y: 0, w: carouselContent.width, h: carouselContent.height) reuseTable.tag = tableTag reuseView = UIView(frame: CGRect(x: 0, y: 0, w: carouselContent.width, h: carouselContent.height)) reuseView.addSubview(reuseTable) } return reuseView } //2. index change func carouselCurrentItemIndexDidChange(_ carousel: iCarousel) { if carouselContent == carousel { // 如果是点击segment控件,则不需要改变tag index if !clickTag { if !segControl.sectionTitles.isBeyond(index: currentIndex) { segControl.setSelectedSegmentIndex(UInt(currentIndex), animated: true) } } clickTag = false displayTableView?.reloadData() if segControl.selectedSegmentIndex == 0 { if reposData.isEmpty { tvc_getReposRequest() } leftItem?.isHidden = false } else if segControl.selectedSegmentIndex == 1 { leftItem?.isHidden = false if self.devesData.isEmpty { tvc_getUserRequest() } } else if segControl.selectedSegmentIndex == 2 { leftItem?.isHidden = true if showcasesData.isEmpty { tvc_getShowcasesRequest(page: showcasePage) } } } } //可循环滑动 // func carousel(_ carousel: iCarousel, valueFor option: iCarouselOption, withDefault value: CGFloat) -> CGFloat { // switch option { // case .wrap: // return 1 // default: // return value // } // } } // MARK: - 筛选视图的回调 extension BFTrendingController : CPFilterTableViewProtocol { //filter delegate func didSelectValueColoumn(_ row: Int, type: String, value: String) { if type == "Since" { paraSince = value } else if type == "Language" { if value == "All" { paraLanguage = "all" } else { paraLanguage = value.replacingOccurrences(of: " ", with: "-").lowercased() } } tvc_filterViewDisapper() tvc_updateNetrokData() displayTableView?.setContentOffset(CGPoint.zero, animated: true) } func didSelectTypeColoumn(_ row: Int, type: String) { } func didTapSinceTime(since: String) { paraSince = since tvc_filterViewDisapper() tvc_updateNetrokData() displayTableView?.setContentOffset(CGPoint.zero, animated: true) } } extension BFTrendingController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if segControl.selectedSegmentIndex == 0 { return self.reposData.count } else if segControl.selectedSegmentIndex == 1 { return self.devesData.count } return self.showcasesData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row var cellId = "" if segControl.selectedSegmentIndex == 0 { cellId = "BFRepositoryTypeFourCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFRepositoryTypeFourCell if cell == nil { cell = (BFRepositoryTypeFourCell.cellFromNibNamed("BFRepositoryTypeFourCell") as? BFRepositoryTypeFourCell) } if self.reposData.isBeyond(index: row) { return cell! } let repos = self.reposData[row] cell!.objRepos = repos cell?.setBothEndsLines(row, all: reposData.count) return cell! } else if segControl.selectedSegmentIndex == 1 { cellId = "BFUserTypeOneCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFUserTypeOneCell if cell == nil { cell = (BFUserTypeOneCell.cellFromNibNamed("BFUserTypeOneCell") as? BFUserTypeOneCell) } if self.devesData.isBeyond(index: row) { return cell! } let user = self.devesData[row] cell!.user = user cell!.userNo = row cell?.setBothEndsLines(row, all: devesData.count) return cell! } cellId = "BFTrendingShowcaseCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFTrendingShowcaseCell if cell == nil { cell = (BFTrendingShowcaseCell.cellFromNibNamed("BFTrendingShowcaseCell") as? BFTrendingShowcaseCell) } if self.showcasesData.isBeyond(index: row) { return cell! } let showcase = showcasesData[row] cell!.showcase = showcase cell?.setBothEndsLines(row, all: showcasesData.count) return cell! } } extension BFTrendingController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if segControl.selectedSegmentIndex == 0 { return 85 } else if segControl.selectedSegmentIndex == 1 { return 71 } return 128 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) tvc_filterViewDisapper() if !UserManager.shared.needLoginAlert() { return } if segControl.selectedSegmentIndex == 0 { let repos = self.reposData[indexPath.row] let objRepos = ObjRepos() repos.full_name = repos.full_name?.replacing(" ", with: "") objRepos.name = repos.full_name objRepos.url = repos.repo_url JumpManager.shared.jumpReposDetailView(repos: objRepos, from: .other) } else if segControl.selectedSegmentIndex == 1 { let dev = self.devesData[indexPath.row] let objUser = ObjUser() objUser.login = dev.login JumpManager.shared.jumpUserDetailView(user: objUser) } else { let showcase = self.showcasesData[indexPath.row] let caseVC = BFShowcaseDetailController() caseVC.showcase = showcase caseVC.hidesBottomBarWhenPushed = true self.navigationController?.pushViewController(caseVC, animated: true) } } } extension BFTrendingController { /// 下拉刷新 override func headerRefresh() { self.displayTableView?.mj_header.endRefreshing() if segControl.selectedSegmentIndex == 2 { showcasePage = 1 } tvc_updateNetrokData() } /// 上拉加载 override func footerRefresh() { self.displayTableView?.mj_footer.endRefreshing() if segControl.selectedSegmentIndex == 2 { showcasePage += 1 tvc_updateNetrokData() } } } ================================================ FILE: BeeFun/BeeFun/View/Trending/Model/BFExploreNavigationModel.swift ================================================ // // BFExploreNavigationModel.swift // BeeFun // // Created by WengHengcong on 2018/10/6. // Copyright © 2018年 LuCi. All rights reserved. // import Foundation import ObjectMapper class BFExploreNavigationModel: NSObject, Mappable { var navType: String? var logo: String? var title: String? var desc: String? required init?(map: Map) { } func mapping(map: Map) { navType <- map["navType"] logo <- map["logo"] title <- map["title"] desc <- map["desc"] } } ================================================ FILE: BeeFun/BeeFun/View/Trending/Model/BFGihubTrendingTimeEnum.swift ================================================ // // GIhubTrendingTimeEnum.swift // BeeFun // // Created by WengHengcong on 2018/10/4. // Copyright © 2018年 LuCi. All rights reserved. // import Foundation // daily/weekly/monthly enum BFGihubTrendingTimeEnum: String { case daily = "daily" case weekly = "weekly" case monthly = "monthly" } ================================================ FILE: BeeFun/BeeFun/View/Trending/Model/BFGithubTrendingRequsetModel.swift ================================================ // // RequsetGithubTrendingModel.swift // BeeFun // // Created by WengHengcong on 2018/10/4. // Copyright © 2018年 LuCi. All rights reserved. // import UIKit import ObjectMapper public class BFGithubTrendingRequsetModel: NSObject, Mappable { /// 从1.数据库,2.GitHub解析 获取数据 var source: Int = 1 /// 假如不传type Repos and User,否则 1.Repos、2.User var type: Int? /// 时间,获取Trending的时间:monthly/daily/monthly var time: BFGihubTrendingTimeEnum? /// 指的是要获取什么语言,可选参数,无须区分也可传all var language: String? /// 当前页面,必选参数,若不分页,传0 var page: Int? /// 每页数目,必选参数,若不分页,传0 var perpage: Int? /// 排序列:star_num(Repo)、up_star_num(Repo)、name(User/Repo)、pos(针对User,默认使用排名) var sort: String? /// 排序,只能是asc或者desc var direction: String? public override init() { } public required init?(map: Map) { } public func mapping(map: Map) { source <- map["source"] type <- map["type"] time <- map["time"] language <- map["language"] page <- map["page"] perpage <- map["perpage"] sort <- map["sort"] direction <- map["direction"] } } ================================================ FILE: BeeFun/BeeFun/View/Trending/Model/BFGithubTrendingUserModel.swift ================================================ // // GithubTrendingUserModel.swift // BeeFun // // Created by WengHengcong on 2018/10/4. // Copyright © 2018年 LuCi. All rights reserved. // import UIKit import ObjectMapper /* { "url":"https://github.com/SatanWoo", "avatar":"https://avatars3.githubusercontent.com/u/1303079?s/....", "login":"SatanWoo" } */ class BFGithubTrendingUserModel: NSObject, Mappable { /// 主页 var url: String? /// 头像 var avatar: String? /// login 名 var login: String? required init?(map: Map) { } func mapping(map: Map) { url <- map["url"] avatar <- map["avatar"] login <- map["login"] } } ================================================ FILE: BeeFun/BeeFun/View/Trending/Model/BFGithubTrengingModel.swift ================================================ // // GithubTrengingRepositoryModel.swift // BeeFun // // Created by WengHengcong on 2018/10/3. // Copyright © 2018年 LuCi. All rights reserved. // import Foundation import ObjectMapper /* { "today": "2018-10-04", "time_period": "daily", "language": "objective-c", "full_name": "SatanWoo / JSDebugger", "type": 1, "pos": 1, "user_url": null, "login": null, "user_id": null, "repo_name": "JSDebugger", "repo_url": "https://github.com/SatanWoo/JSDebugger", "repo_language_color": "#438eff", "repo_language": "Objective-C", "star_num": 28, "star_url": "https://github.com/SatanWoo/JSDebugger/stargazers", "fork_num": 4, "fork_url": "https://github.com/SatanWoo/JSDebugger/network", "star_text_time_period": "19 stars today", "up_star_num": 19, "user_avatar": null, "created_at": null, "updated_at": null, "repo_desc": "JavaScript-Based Debugger For Inspecting Running State Of Your Application", "built_by_users": "[{\"url\":\"https://github.com/SatanWoo\",\"avatar\":\"https://avatars3.githubusercontent.com/u/1303079?s\\u003d40\\u0026v\\u003d4\",\"login\":\"SatanWoo\"},{\"url\":\"https://github.com/ValiantCat\",\"avatar\":\"https://avatars0.githubusercontent.com/u/6142855?s\\u003d40\\u0026v\\u003d4\",\"login\":\"ValiantCat\"}]" } */ class BFGithubTrengingModel: NSObject, Mappable { var today: String? var time_period: String? var language: String? var full_name: String? var type: Int? var pos: Int? var user_url: String? var login: String? var user_id: Int? var repo_name: String? var repo_url: String? var repo_language_color: String? var repo_language: String? var star_num: Int? var star_url: String? var fork_num: Int? var fork_url: String? var star_text_time_period: String? var up_star_num: Int? var user_avatar: String? var created_at: String? var updated_at: String? var repo_desc: String? var repo_owner: String? //以下字段为解析后的字段 /// repo的维护者 var built_by_users: [BFGithubTrendingUserModel]? /// repo是否被用户star var starred: Bool? /// user是否被用户follow var followed: Bool? private var built_by_users_string: String? required init?(map: Map) { } func mapping(map: Map) { today <- map["today"] time_period <- map["time_period"] language <- map["language"] full_name <- map["full_name"] pos <- map["pos"] user_url <- map["user_url"] login <- map["login"] user_id <- map["user_id"] repo_name <- map["repo_name"] repo_owner <- map["repo_owner"] repo_url <- map["repo_url"] type <- map["type"] repo_language_color <- map["repo_language_color"] repo_language <- map["repo_language"] star_num <- map["star_num"] star_url <- map["star_url"] fork_num <- map["fork_num"] fork_url <- map["fork_url"] star_text_time_period <- map["star_text_time_period"] up_star_num <- map["up_star_num"] user_avatar <- map["user_avatar"] created_at <- map["created_at"] updated_at <- map["updated_at"] repo_desc <- map["repo_desc"] built_by_users_string <- map["built_by_users"] if let userJson = built_by_users_string, let users = Mapper().mapArray(JSONString: userJson) { built_by_users = users } } } ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/BFShowcaseHeaderView.swift ================================================ // // BFShowcaseHeaderView.swift // BeeFun // // Created by WengHengcong on 05/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit /// 实现xib方式一: /* 1. 不要填写File‘s’ Owner,填写对应Custom Class 2. 实现loadViewFromNib方法,返回一个视图 3. 其他实现一致 */ /* 1. 填写填写File‘s’ Owner,不要填写对应Custom Class 2. 实现 */ class BFShowcaseHeaderView: UIView { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var bottomLineV: UIView! @IBOutlet weak var repoLabel: UILabel! @IBOutlet weak var langLabel: UILabel! var showcase: ObjShowcase? { didSet { fillDataToUI() } } override init(frame: CGRect) { super.init(frame: frame) customView() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func awakeFromNib() { super.awakeFromNib() customView() } static func loadViewFromNib() -> BFShowcaseHeaderView { var nibContents: Array = Bundle.main.loadNibNamed("BFShowcaseHeaderView", owner: self, options: nil)! let xibBasedCell = nibContents[0] return xibBasedCell as! BFShowcaseHeaderView } func customView() { nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.bfSystemFont(ofSize: 20.0) nameLabel.adjustFontSizeToFitWidth(minScale: 0.5) descLabel.numberOfLines = 0 descLabel.font = UIFont.middleSizeSystemFont() descLabel.textColor = UIColor.hex("#111111", alpha: 1.0) repoLabel.textColor = UIColor.bfLabelSubtitleTextColor repoLabel.textAlignment = .left repoLabel.font = UIFont.smallSizeSystemFont() repoLabel.adjustFontSizeToFitWidth(minScale: 0.5) langLabel.textColor = UIColor.bfLabelSubtitleTextColor langLabel.textAlignment = .left langLabel.font = UIFont.smallSizeSystemFont() langLabel.adjustFontSizeToFitWidth(minScale: 0.5) bottomLineV.backgroundColor = UIColor.bfLineBackgroundColor } func fillDataToUI() { if let name = showcase?.name { nameLabel.text = name } if let desc = showcase?.cdescription { descLabel.text = desc } if let reponame = showcase?.trend_repo_text { repoLabel.text = reponame } if let lan = showcase?.trend_lan_text { langLabel.text = lan } setNeedsDisplay() } } ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/BFShowcaseHeaderView.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/BFTrendingSearchBar.swift ================================================ // // BFTrendingSearchBar.swift // BeeFun // // Created by WengHengcong on 13/10/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFTrendingSearchBar: UIView { override var intrinsicContentSize: CGSize { return UIView.layoutFittingExpandedSize } } ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/BFTrendingShowcaseCell.swift ================================================ // // BFTrendingShowcaseCell.swift // BeeFun // // Created by WengHengcong on 3/8/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import Kingfisher class BFTrendingShowcaseCell: BFBaseCell { @IBOutlet weak var bgImageV: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var descLabel: UILabel! @IBOutlet weak var bottomLineV: UIView! @IBOutlet weak var repoLabel: UILabel! @IBOutlet weak var langLabel: UILabel! var showcase: ObjShowcase? { didSet { fillDataToUI() } } override func p_customCellView() { super.p_customCellView() contentView.backgroundColor = UIColor.bfViewBackgroundColor bgImageV.backgroundColor = UIColor.clear bgImageV.image = UIImage(color: UIColor.clear) nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.bfSystemFont(ofSize: 20.0) nameLabel.adjustFontSizeToFitWidth(minScale: 0.5) descLabel.numberOfLines = 0 descLabel.font = UIFont.middleSizeSystemFont() descLabel.textColor = UIColor.hex("#111111", alpha: 1.0) repoLabel.textColor = UIColor.bfLabelSubtitleTextColor repoLabel.textAlignment = .left repoLabel.font = UIFont.smallSizeSystemFont() repoLabel.adjustFontSizeToFitWidth(minScale: 0.5) langLabel.textColor = UIColor.bfLabelSubtitleTextColor langLabel.textAlignment = .left langLabel.font = UIFont.smallSizeSystemFont() langLabel.adjustFontSizeToFitWidth(minScale: 0.5) bottomLineV.backgroundColor = UIColor.bfLineBackgroundColor } func fillDataToUI() { if let name = showcase?.name { nameLabel.text = name } if let desc = showcase?.cdescription { descLabel.text = desc } if let reponame = showcase?.trend_repo_text { repoLabel.text = reponame } if let lan = showcase?.trend_lan_text { langLabel.text = lan } setNeedsDisplay() } override func layoutSubviews() { } } ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/BFTrendingShowcaseCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/CPFilterTableView.swift ================================================ // // CPFilterTableView.swift // BeeFun // // Created by WengHengcong on 3/12/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit /// 筛选视图的协议方法 protocol CPFilterTableViewProtocol: class { /// 选中了筛选视图中的类型 /// /// - Parameters: /// - row: <#row description#> /// - type: <#type description#> func didSelectTypeColoumn(_ row: Int, type: String) /// 选中了筛选视图中的值 /// /// - Parameters: /// - row: <#row description#> /// - type: <#type description#> /// - value: <#value description#> func didSelectValueColoumn(_ row: Int, type: String, value: String) func didTapSinceTime(since: String) } /// 筛选视图的列数 /// /// - two: 两列 /// - three: 三列 public enum CPFilterTableViewColumns: Int { case two = 2 case three = 3 } /// 筛选视图 class CPFilterTableView: UIView { let cellID = "FilterCell" weak var filterDelegate: CPFilterTableViewProtocol? /// 筛选视图的列数 var coloumn: CPFilterTableViewColumns = .two /// 每行的宽度组合(多个tableview) var rowWidths: [CGFloat] = [0, 0] /// 每行的高度组合(多个tableview) var rowHeights: [CGFloat] = [0.0, 0.0] var filterTypes: [String] = [] var filterData: [[String]] = [[]] { didSet { resetAllColoumnsData() } } let indexArr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] var mutipleSectionData: [[[String]]] = [[[]]] var mutipleSectionIndex: [[String]] = [] let sinceArr: [String] = ["daily".localized, "weekly".localized, "monthly".localized] /// 选中的since index var selSinceIndex = 0 let sinceBackV = UIView() let sinceLabel = UILabel() var sinceButtons: [UIButton] = [] let separateLine = UIView() /// 当前选中的类型:左边tableview时候的index var selTypeIndex = 0 /// 选择第二个表格的 section 和 row var selSecValueSectionIndex = 0 var selSecValueRowIndex = 0 /// 类型Table var firTableView: UITableView? /// 值Table var secTableView: UITableView? var tableviews: [UITableView] = [] let bottomView = UIView() // MARK: - view cycle override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } // MARK: - View func filterViewInit() { ftv_customView() } func ftv_customView() { for subs in self.subviews { subs.removeFromSuperview() } customSinceView() customTableView() customBottomView() layoutAllSubviews() } func customSinceView() { separateLine.backgroundColor = UIColor.bfLineBackgroundColor addSubview(separateLine) sinceLabel.font = UIFont.bfSystemFont(ofSize: 14.0) sinceLabel.text = "Since".localized sinceLabel.textAlignment = .center sinceLabel.textColor = UIColor.black sinceLabel.backgroundColor = UIColor.white sinceBackV.addSubview(sinceLabel) for (index, sinceTime) in sinceArr.enumerated() { let sinceTimeBtn = UIButton() sinceTimeBtn.setTitle(sinceTime, for: .normal) sinceTimeBtn.setTitleColor(UIColor.black, for: .normal) sinceTimeBtn.setTitleColor(UIColor.bfRedColor, for: .selected) sinceTimeBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 14.0) sinceTimeBtn.backgroundColor = UIColor.white sinceTimeBtn.addTarget(self, action: #selector(tapSinceButton(sender:)), for: .touchUpInside) if index == 0 { sinceTimeBtn.isSelected = true } sinceBackV.addSubview(sinceTimeBtn) sinceButtons.append(sinceTimeBtn) } addSubview(sinceBackV) } func customTableView() { //如果column的数目与当前的宽度组合数目不对,直接返回 if (coloumn.rawValue != rowWidths.count) || (coloumn.rawValue != rowHeights.count) { print("check coloumns and the datasouce count is equal") return } firTableView = UITableView() secTableView = UITableView() self.addSubview(firTableView!) self.addSubview(secTableView!) tableviews.append(firTableView!) tableviews.append(secTableView!) for (index, tableView) in tableviews.enumerated() { tableView.dataSource = self tableView.delegate = self tableView.separatorStyle = .none tableView.rowHeight = rowHeights[index] if #available(iOS 11, *) { tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 } tableView.register(UITableViewCell.self, forCellReuseIdentifier:cellID) tableView.sectionIndexColor = UIColor.bfLabelSubtitleTextColor } } func customBottomView() { bottomView.backgroundColor = UIColor.bfRedColor self.addSubview(bottomView) } func layoutAllSubviews() { let firColoumWidth = rowWidths[0] let sinceViewHeight: CGFloat = 40 sinceBackV.frame = CGRect(x: 0, y: 0, w: ScreenSize.width, h: sinceViewHeight) sinceLabel.frame = CGRect(x: 0, y: 0, w: firColoumWidth, h: sinceBackV.height) let separateH: CGFloat = 1 separateLine.frame = CGRect(x: 0, y: sinceBackV.bottom, w: sinceBackV.width, h: separateH) let btnW = (sinceBackV.width-firColoumWidth)/CGFloat(sinceArr.count) for (index, sinceTimeBtn) in sinceButtons.enumerated() { let x = btnW*CGFloat(index)+sinceLabel.right sinceTimeBtn.frame = CGRect(x: x, y: 0, w: btnW, h: sinceBackV.height) } let bottomHeight: CGFloat = 10 let tableHeight = self.height-40-bottomHeight let tableY = separateLine.bottom for (index, tableView) in tableviews.enumerated() { let width = rowWidths[index] if index == 0 { tableView.frame = CGRect(x: 0, y: tableY, width: width, height: tableHeight) tableView.backgroundColor = UIColor.bfViewBackgroundColor } else { let lastTableview = tableviews[index-1] tableView.frame = CGRect(x: lastTableview.right, y: tableY, width: width, height: tableHeight) tableView.backgroundColor = UIColor.white } } bottomView.frame = CGRect(x: 0, y: firTableView!.bottom, width: width, height: bottomHeight) } // MARK: - Reload /// 重新加载所有数据 func resetAllColoumnsData() { mutipleSectionData.removeAll() mutipleSectionIndex.removeAll() //开始处理N组数据,将其索引化 for typeData in filterData { //每个类型下的数据,比如language下的数据 var typeArr: [[String]] = [] var sectionIndexArr: [String] = [] for sectionIndex in indexArr { let sectionArr: [String] = typeData.filter({ $0.lowercased().hasPrefix(sectionIndex.lowercased()) }) if !sectionArr.isEmpty { typeArr.append(sectionArr) sectionIndexArr.append(sectionIndex) } } if !sectionIndexArr.isEmpty { mutipleSectionIndex.append(sectionIndexArr) } if !typeArr.isEmpty { mutipleSectionData.append(typeArr) } } if firTableView != nil { firTableView!.reloadData() } if secTableView != nil { secTableView!.reloadData() } } /// 重置类型表格之外的所有数据 /// /// - Parameter selindex: <#selindex description#> func resetOtherColoumnsData(_ selindex: Int) { secTableView!.reloadData() } /// 重置所有属性 func resetProperty() { selTypeIndex = 0 selSecValueRowIndex = 0 selSecValueSectionIndex = 0 } // MARK: - Action @objc func tapSinceButton(sender: UIButton) { for button in sinceButtons { button.isSelected = sender == button } if let since = sender.currentTitle?.enLocalized { filterDelegate?.didTapSinceTime(since: since) } } } extension CPFilterTableView:UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { if mutipleSectionData.isEmpty { return 1 } if tableView == firTableView { return 1 } else { if !mutipleSectionData.isBeyond(index: selTypeIndex) { let typeData = mutipleSectionData[selTypeIndex] return typeData.count } } return 1 } func sectionIndexTitles(for tableView: UITableView) -> [String]? { if mutipleSectionData.isEmpty { return nil } if tableView == firTableView { return nil } else { if !mutipleSectionIndex.isBeyond(index: selTypeIndex) { let indexData = mutipleSectionIndex[selTypeIndex] return indexData } } return nil } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if filterTypes.isEmpty { return 0 } if mutipleSectionData.isEmpty { return 0 } if tableView == firTableView { return filterTypes.count } else { if !mutipleSectionData.isBeyond(index: selTypeIndex) { let typeData = mutipleSectionData[selTypeIndex] let sectionData = typeData[section] return sectionData.count } return 0 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cellText = "" let section = indexPath.section let row = indexPath.row if tableView == firTableView { cellText = filterTypes[row] } else { let typeData = mutipleSectionData[selTypeIndex] let sectionData = typeData[section] if !sectionData.isBeyond(index: row) { cellText = sectionData[row] } } let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) cell.textLabel?.textColor = UIColor.iOS11Black if tableView == firTableView { cell.backgroundColor = UIColor.bfViewBackgroundColor cell.textLabel!.font = UIFont.bfSystemFont(ofSize: 14.0) cell.textLabel!.adjustFontSizeToFitWidth(minScale: 0.5) cell.addBorderSingle(UIColor.bfLineBackgroundColor, width: 0.5, at: .bottom) cell.addBorderSingle(UIColor.bfLineBackgroundColor, width: 0.5, at: .right) if indexPath.row == selTypeIndex { cell.backgroundColor = UIColor.white cell.removeBorder(.right) cell.textLabel?.textColor = UIColor.black } } else { cell.textLabel!.font = UIFont.bfSystemFont(ofSize: 12.0) cell.textLabel!.adjustFontSizeToFitWidth(minScale: 0.5) cell.selectionStyle = .none let selValueIndex = selSecValueRowIndex if row == selValueIndex && section == selSecValueSectionIndex { cell.textLabel?.textColor = UIColor.bfRedColor } } //所有数据从Plist读取的时候,已经经过本地化了 cell.textLabel!.text = cellText return cell } } extension CPFilterTableView:UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if tableView == firTableView { return rowHeights[0] } return rowHeights[1] } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let section = indexPath.section let row = indexPath.row if tableView == firTableView { selTypeIndex = row } else { selSecValueSectionIndex = section selSecValueRowIndex = row } let indexOfTableviews = (tableView == firTableView) ? 0:1 /// 其中的数据在传进来时,已经本地化 let type = filterTypes[selTypeIndex].enLocalized //其中的数据从plist中读取已经本地化 let typeData = mutipleSectionData[selTypeIndex] let sectionData = typeData[section] if !sectionData.isBeyond(index: row) { let value = (sectionData[selSecValueRowIndex]).enLocalized resetAllColoumnsData() if filterDelegate != nil { if indexOfTableviews == 0 { filterDelegate?.didSelectTypeColoumn(indexPath.row, type: type) } else if indexOfTableviews == 1 { filterDelegate?.didSelectValueColoumn(indexPath.row, type: type, value: value) } } } } func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int { return index } } ================================================ FILE: BeeFun/BeeFun/View/Trending/ViewCell/InfoButton.swift ================================================ // // InfoButton.swift // BeeFun // // Created by WengHengcong on 2017/3/10. // Copyright © 2017年 JungleSong. All rights reserved. // import UIKit class ObjInfo: NSObject { var image: String? var title: String? var url: String? init(image: String?, title: String?, url: String?) { self.image = image self.title = title self.url = url } } class InfoButton: UIButton { var imageV: UIImageView? var titleL: UILabel? var url: String? var objInfo: ObjInfo? { didSet { ib_fillData() } } override init(frame: CGRect) { super.init(frame: frame) } init(image: String?, title: String?, url: String?) { super.init(frame:CGRect.zero) self.objInfo = ObjInfo(image:image, title:title, url:url) } convenience init(info: ObjInfo) { self.init(image:info.image, title:info.title, url:info.url) self.objInfo = info } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func ib_customView() { if imageV == nil { imageV = UIImageView() imageV?.backgroundColor = UIColor.red self.addSubview(imageV!) } if titleL == nil { titleL = UILabel() titleL?.backgroundColor = UIColor.green self.addSubview(titleL!) } } override func layoutSubviews() { super.layoutSubviews() if imageV != nil { let imgw: CGFloat = 20 let imgx = self.width * 0.2 let imgy = (self.height - imgw)/2 imageV?.snp.makeConstraints({ (make) in make.top.equalTo(imgy) make.leading.equalTo(imgx) make.width.equalTo(imgw) make.height.equalTo(imgw) }) } if titleL != nil { let titx = (imageV?.right)! + 10 let tity = 0 let tith = self.height titleL?.snp.makeConstraints({ (make) in make.top.equalTo(tity) make.leading.equalTo(titx) make.trailing.equalTo(0) make.height.equalTo(tith) }) } } func ib_fillData() { ib_customView() if let image = objInfo?.image { imageV?.image = UIImage(named: image) } if let title = objInfo?.title { titleL?.text = title } if let url = objInfo?.url { self.url = url } self.setNeedsLayout() } } ================================================ FILE: BeeFun/BeeFun/View/User/BFUserDetailController.swift ================================================ // // BFUserDetailController.swift // BeeFun // // Created by WengHengcong on 3/10/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh import ObjectMapper import Kingfisher public enum CPUserActionType: String { case Follow = "watch" case Repos = "star" case Following = "fork" } class BFUserDetailController: BFBaseViewController { var developerInfoV: CPDeveloperInfoView = CPDeveloperInfoView(frame: CGRect.zero) var followBtn: UIButton = UIButton() var developer: ObjUser? var cellModels: [JSCellModel] = [] var actionType: CPUserActionType = .Follow var followed: Bool = false // MARK: - view cycle override func viewDidLoad() { if let username = developer!.name { self.title = username } else { self.title = developer!.login! } super.viewDidLoad() dvc_customView() dvc_setupTableView() dvc_getUserinfoRequest() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) dvc_checkUserFollowed() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } // MARK: - view func dvc_customView() { self.tableView.isHidden = true self.developerInfoV.isHidden = true self.followBtn.isHidden = true self.rightItemImage = UIImage(named: "nav_share") self.rightItemSelImage = UIImage(named: "nav_share") self.rightItem?.isHidden = !ShareManager.shared.enable self.navigationController?.setNavigationBarHidden(false, animated: false) self.view.backgroundColor = UIColor.bfViewBackgroundColor self.view.addSubview(developerInfoV) self.view.addSubview(tableView) self.view.addSubview(followBtn) developerInfoV.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: 183.0) let tabY = developerInfoV.bottom+15.0 let tabH = ScreenSize.height-tabY tableView.frame = CGRect(x: 0, y: tabY, width: ScreenSize.width, height: tabH) developerInfoV.userActionDelegate = self followBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 15.0) followBtn.backgroundColor = UIColor.bfRedColor followBtn.radius = 3.0 followBtn.addTarget(self, action: #selector(BFUserDetailController.dvc_followAction), for: UIControl.Event.touchUpInside) let followX: CGFloat = 10.0 let followW = ScreenSize.width-2*followX let followH: CGFloat = 40.0 let followY = ScreenSize.height-followH-57.0 followBtn.frame = CGRect(x: followX, y: followY, width: followW, height: followH) self.dvc_updateFolloweBtn() } func dvc_setupTableView() { refreshHidden = .all self.automaticallyAdjustsScrollViewInsets = false } // MARK: - action override func headerRefresh() { super.headerRefresh() } override func footerRefresh() { super.footerRefresh() } func dvc_updateFolloweBtn() { if followed { followBtn.setTitle("Unfollow".localized, for: UIControl.State()) } else { followBtn.setTitle("Follow".localized, for: UIControl.State()) } } func dvc_updateViewContent() { removeReloadView() tableView.isHidden = false developerInfoV.isHidden = false followBtn.isHidden = false if developer==nil { return } cellModels.removeAll() if developer!.html_url != nil { let homeModel = JSCellModel(["type": "image", "id": "homepage", "key": "Homepage".localized, "icon": "user_home", "discolsure": "true"]) cellModels.append(homeModel) } if let joinTime: String = developer!.created_at { let ind = joinTime.index(joinTime.startIndex, offsetBy: 10) let subStr = joinTime.substring(to: ind) let join = "Joined on".localized + " "+subStr let joinModel = JSCellModel(["type": "image", "id": "join", "key": "Join".localized, "icon": "user_time", "value": join, "discolsure": "false"]) cellModels.append(joinModel) } if let location: String = developer!.location { let locModel = JSCellModel(["type": "image", "id": "location", "key": "Location".localized, "icon": "user_loc", "value": location, "discolsure": "false"]) cellModels.append(locModel) } if let company = developer!.company { let companyModel = JSCellModel(["type": "image", "id": "company", "key": "Company".localized, "icon": "user_org", "value": company, "discolsure": "false"]) cellModels.append(companyModel) } developerInfoV.developer = developer self.tableView.reloadData() } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } override func rightItemAction(_ sender: UIButton?) { let shareContent: ShareContent = ShareContent() shareContent.contentType = SSDKContentType.webPage shareContent.source = .user if let name = developer?.name { shareContent.title = name } else { shareContent.title = developer?.login } shareContent.url = developer?.html_url ?? "" if let bio = developer?.bio { shareContent.content = "A Talented Developer".localized + ":\((developer?.login)!)\n" + "\(bio).\n" + "\(shareContent.url!) "+"from BeeFun App".localized+" "+"Download Here".localized + SocialAppStore } else { shareContent.content = "A Talented Developer".localized + ":\((developer?.login)!)\n" + "\(shareContent.url!) "+"from BeeFun App".localized+" "+"Download Here".localized + SocialAppStore } if let urlStr = developer?.avatar_url { shareContent.image = urlStr as AnyObject? ShareManager.shared.share(content: shareContent) } else { shareContent.image = UIImage(named: "app_logo_90") ShareManager.shared.share(content: shareContent) } } @objc func dvc_followAction() { let follower = UserManager.shared.login ?? "Unknown User" let befollowed = self.title ?? "Unknown User" if followBtn.currentTitle == "Follow".localized { self.dvc_followUserRequest() AnswerManager.logContentView(name: "Follow", type: UserActionType.follow.rawValue, id: follower, attributes: ["follow": follower, "followed": befollowed]) } else if followBtn.currentTitle == "Unfollow".localized { self.dvc_unfolloweUserRequest() AnswerManager.logContentView(name: "UnFollow", type: UserActionType.unfollow.rawValue, id: follower, attributes: ["follow": follower, "followed": befollowed]) } } // MARK: - request /// 是否关注该用户 func dvc_checkUserFollowed() { if let username = developer!.login { Provider.sharedProvider.request(.checkUserFollowing(username:username) ) { (result) -> Void in var message = kNoDataFoundTip switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = true } else { self.followed = false } self.dvc_updateFolloweBtn() case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func dvc_getUserinfoRequest() { if let username = developer!.login { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.userInfo(username: username) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { if let result: ObjUser = Mapper().map(JSONObject: try response.mapJSON() ) { self.developer = result self.dvc_updateViewContent() return } else { } } catch { } self.showReloadView() case .failure: self.showReloadView() } } } } override func reconnect() { super.reconnect() dvc_getUserinfoRequest() dvc_checkUserFollowed() } func dvc_followUserRequest() { if let username = developer!.login { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.follow(username:username) ) { (result) -> Void in hud.hide(animated: true) var message = kNoDataFoundTip switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = true JSMBHUDBridge.showSuccess("Follow Success".localized, view: self.view) } self.dvc_updateFolloweBtn() case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } func dvc_unfolloweUserRequest() { if let username = developer!.login { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.unfollow(username:username) ) { (result) -> Void in hud.hide(animated: true) var message = kNoDataFoundTip switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = false JSMBHUDBridge.showSuccess("UnFollow Success".localized, view: self.view) } self.dvc_updateFolloweBtn() case .failure: message = kNetworkErrorTip JSMBHUDBridge.showError(message, view: self.view) } } } } } extension BFUserDetailController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 0 { return cellModels.count } return 0 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellModel = cellModels[row] var cell = tableView.dequeueReusableCell(withIdentifier: "BFUserTypeThirdCellIdentifier") as? JSImageCell if cell == nil { cell = JSCellFactory.cell(type: cellModel.type!) as? JSImageCell } cell?.model = cellModel cell?.bothEndsLine(row, all: cellModels.count) return cell! } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { return nil } let view = UIView(frame: CGRect(x: 0, y: 0, width: self.view.width, height: 10)) view.backgroundColor = UIColor.bfViewBackgroundColor return view } } extension BFUserDetailController { func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 { return 0 } return 10 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row let cellM = cellModels[row] if cellM.identifier == "homepage" { JumpManager.shared.jumpWebView(url: self.developer?.html_url) } } } extension BFUserDetailController: UserProfileActionProtocol { func viewFollowAction() { actionType = .Follow segueGotoViewController() } func viewReposAction() { actionType = .Repos segueGotoViewController() } func viewFollowingAction() { actionType = .Following segueGotoViewController() } func segueGotoViewController() { if !UserManager.shared.isLogin { JSMBHUDBridge.showError(kLoginFirstTip, view: self.view) return } switch actionType { case .Follow: let uname = developer!.login let dic: [String: String] = ["uname": uname!, "type": "follower"] let vc = BFUserListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) case .Repos: let uname = developer!.login let dic: [String: String] = ["uname": uname!, "type": "myrepositories"] let vc = BFRepoListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) case .Following: let uname = developer!.login let dic: [String: String] = ["uname": uname!, "type": "following"] let vc = BFUserListController() vc.hidesBottomBarWhenPushed = true vc.dic = dic vc.username = dic["uname"] vc.viewType = dic["type"] self.navigationController?.pushViewController(vc, animated: true) } } } ================================================ FILE: BeeFun/BeeFun/View/User/BFUserListController.swift ================================================ // // CPUserListController.swift // BeeFun // // Created by wenghengcong on 16/1/30. // Copyright © 2016年 JungleSong. All rights reserved. // import UIKit import Moya import Foundation import MJRefresh import ObjectMapper /// 用户列表页 class BFUserListController: BFBaseViewController { //incoming var var dic: [String: String]? var username: String? var viewType: String? // MARK: request parameters var userData: [ObjUser] = [] var userPageVal = 1 var userPerpageVal = 15 var typeVal: String = "owner" var sortVal: String = "created" var directionVal: String = "desc" override func viewDidLoad() { if viewType == "follower" { self.title = "Followers".localized } else if viewType == "following" { self.title = "Following".localized } super.viewDidLoad() fvc_addNaviBarButtonItem() fvc_setupTableView() fvc_selectDataSource() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func leftItemAction(_ sender: UIButton?) { _ = self.navigationController?.popViewController(animated: true) } func fvc_addNaviBarButtonItem() { /* let btnName = UIButton() btnName.setImage(UIImage(named: "bubble_consulting_chat-512"), forState: .Normal) btnName.frame = CGRectMake(0, 0, 30, 30) btnName.addTarget(self, action: Selector("tvc_rightButtonTouch"), forControlEvents: .TouchUpInside) //.... Set Right/Left Bar Button item let rightBarButton = UIBarButtonItem() rightBarButton.customView = btnName self.navigationItem.rightBarButtonItem = rightBarButton */ } func fvc_rightButtonTouch() { } func fvc_setupTableView() { self.view.addSubview(tableView) self.tableView.frame = CGRect(x: 0, y: uiTopBarHeight, width: ScreenSize.width, height: ScreenSize.height-uiTopBarHeight) self.automaticallyAdjustsScrollViewInsets = false } // 顶部刷新 override func headerRefresh() { super.headerRefresh() userPageVal = 1 fvc_selectDataSource() } // 底部刷新 override func footerRefresh() { super.footerRefresh() userPageVal += 1 fvc_selectDataSource() } func fvc_updateViewContent() { removeReloadView() tableView.isHidden = false tableView.reloadData() } // MARK: - fetch data form request /// 获取对应数据源数据 func fvc_selectDataSource() { if self.viewType == "follower" { tvc_getUserFollowerRequest() } else if self.viewType == "following" { tvc_getUserFollowingRequst() } } func tvc_getUserFollowerRequest() { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.userFollowers(page:self.userPageVal, perpage:self.userPerpageVal, username:self.username!) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { let userResult: [ObjUser] = try response.mapArray(ObjUser.self) if self.userPageVal == 1 { self.userData.removeAll() self.userData = userResult } else { self.userData += userResult } self.fvc_updateViewContent() return } catch { } self.showReloadView() case .failure: self.showReloadView() } } } func tvc_getUserFollowingRequst() { let hud = JSMBHUDBridge.showHud(view: self.view) Provider.sharedProvider.request(.userFollowing(page:self.userPageVal, perpage:self.userPerpageVal, username:self.username!) ) { (result) -> Void in hud.hide(animated: true) switch result { case let .success(response): do { let userResult: [ObjUser] = try response.mapArray(ObjUser.self) if self.userPageVal == 1 { self.userData.removeAll() self.userData = userResult } else { self.userData += userResult } self.fvc_updateViewContent() return } catch { } self.showReloadView() self.tableView.isHidden = true case .failure: self.showReloadView() self.tableView.isHidden = true } } } override func reconnect() { super.reconnect() fvc_selectDataSource() } } extension BFUserListController { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.userData.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = indexPath.row let cellId = "BFUserTypeSecCellIdentifier" var cell = tableView.dequeueReusableCell(withIdentifier: cellId) as? BFUserTypeSecCell if cell == nil { cell = (BFUserTypeSecCell.cellFromNibNamed("BFUserTypeSecCell") as? BFUserTypeSecCell) } cell?.setBothEndsLines(row, all: userData.count) let user = self.userData[row] cell!.user = user cell!.userNo = row return cell! } } extension BFUserListController { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 71 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) let user = self.userData[indexPath.row] JumpManager.shared.jumpUserDetailView(user: user) } } ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeOneCell.swift ================================================ // // BFUserTypeOneCell.swift // BeeFun // // Created by WengHengcong on 3/9/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class BFUserTypeOneCell: BFBaseCell { @IBOutlet weak var noLabel: UILabel! @IBOutlet weak var avatarImgV: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var followBtn: UIButton! @IBOutlet weak var reposLabel: UILabel! //距离上:29 @IBOutlet weak var repoTopToSupview: NSLayoutConstraint! //高:33 @IBOutlet weak var repoHeight: NSLayoutConstraint! //13 @IBOutlet weak var repoRight: NSLayoutConstraint! var userNo: Int? { didSet { noLabel.text = "\(userNo!+1)" self.setNeedsLayout() } } var followed: Bool = false var user: BFGithubTrengingModel? { didSet { fillDataToUI() } } override func awakeFromNib() { super.awakeFromNib() // Initialization code tdc_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } // MARK: - View func tdc_customView() { avatarImgV.layer.cornerRadius = 3.0 avatarImgV.layer.masksToBounds = true followBtn.isHidden = true followBtn.backgroundColor = UIColor.white followBtn.addBorderAround(UIColor.bfRedColor, radius: 2.0, width: 1.0) followBtn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 13.0) followBtn.setTitleColor(UIColor.bfRedColor, for: .normal) followBtn.setTitleColor(UIColor.bfRedColor, for: .highlighted) followBtn.addTarget(self, action: #selector(followSomeOneAction), for: .touchUpInside) noLabel.textColor = UIColor.iOS11Black noLabel.font = UIFont.largeSizeSystemFont() nameLabel.textColor = UIColor.iOS11Black nameLabel.font = UIFont.largeSizeSystemFont() nameLabel.adjustFontSizeToFitWidth(minScale: 0.5) reposLabel.font = .smallSizeSystemFont() reposLabel.textAlignment = .left reposLabel.numberOfLines = 2 reposLabel.textColor = .iOS11Black reposLabel.backgroundColor = UIColor.clear let ges = UITapGestureRecognizer(target: self, action: #selector(gotoReposDetailAction)) reposLabel.addGestureRecognizer(ges) //HCTODO: checkUserFollowed() } override func layoutSubviews() { if followBtn.isHidden { repoRight.constant = -followBtn.width } else { repoRight.constant = 13.0 } let textH = reposLabel.text?.height(with: reposLabel.width, font: reposLabel.font) //16.33.42.57 if textH! > CGFloat(20.0) { repoHeight.constant = 34.0 } else { repoHeight.constant = 20.0 } } // MARK: - Aciont @objc func followSomeOneAction() { if let login = user?.login { if followBtn.currentTitle == "Follow".localized { followSomeOne(login: login) } else { unFollowSomeOne(login: login) } } } @objc func gotoReposDetailAction() { let repos = ObjRepos() repos.name = user?.repo_name let objUser = ObjUser() objUser.login = user?.login repos.owner = objUser JumpManager.shared.jumpReposDetailView(repos: repos, from: .other) } // MARK: - Data func fillDataToUI() { if let avatarUrl = user?.user_avatar { avatarImgV.kf.setImage(with: URL(string: avatarUrl)) } if let login = user?.login { if user?.login != nil { //HCTODO: //由于从html网页中解析出来的除英文外可能有乱码,所以,将name先不加上 //let compose = login+name nameLabel.text = login } else { nameLabel.text = login } } if let repoName = user?.repo_name, let repoDesc = user?.repo_desc { let repo = repoName + "/" + repoDesc reposLabel.text = repo } if user?.login != nil && user?.repo_name != nil { reposLabel.isUserInteractionEnabled = true } else { reposLabel.isUserInteractionEnabled = false } /* if let follow = user!.trend_user_follow { if UserManager.shared.isLogin { followBtn.isHidden = false followBtn.setTitle(follow, for: .normal) followBtn.setTitle(follow, for: .highlighted) } else { followBtn.isHidden = true } } else { followBtn.isHidden = true } */ setNeedsDisplay() } // MARK: - Follow func checkUserFollowed() { if let login = user?.login { Provider.sharedProvider.request(.checkUserFollowing(username:login) ) { (result) -> Void in switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = true } else { self.followed = false } self.updageFollowState() case .failure: break } } } } func followSomeOne(login: String) { Provider.sharedProvider.request(.follow(username:login) ) { (result) -> Void in switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = true self.updageFollowState() } case .failure: break } } } func unFollowSomeOne(login: String) { Provider.sharedProvider.request(.unfollow(username:login) ) { (result) -> Void in switch result { case let .success(response): let statusCode = response.statusCode if statusCode == BFStatusCode.noContent.rawValue { self.followed = false self.updageFollowState() } case .failure: break } } } func updageFollowState() { //登录且关注 if UserManager.shared.isLogin && followed { followBtn.isHidden = false } else { followBtn.isHidden = true } //关注时,显示取消关注 if followed { followBtn.setTitle("Unfollow".localized, for: .normal) followBtn.setTitle("Unfollow".localized, for: .highlighted) } else { followBtn.setTitle("Follow".localized, for: .normal) followBtn.setTitle("Follow".localized, for: .highlighted) } setNeedsLayout() } } ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeOneCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeSecCell.swift ================================================ // // BFUserTypeSecCell.swift // BeeFun // // Created by WengHengcong on 04/07/2017. // Copyright © 2017 JungleSong. All rights reserved. // import UIKit class BFUserTypeSecCell: BFBaseCell { @IBOutlet weak var noLabel: UILabel! @IBOutlet weak var avatarImgV: UIImageView! @IBOutlet weak var nameLabel: UILabel! var userNo: Int? { didSet { noLabel.text = "\(userNo!+1)" self.setNeedsLayout() } } var user: ObjUser? { didSet { if let avatarUrl = user?.avatar_url { avatarImgV.kf.setImage(with: URL(string: avatarUrl)) } if let name = user?.login { nameLabel.text = name } } } override func awakeFromNib() { super.awakeFromNib() // Initialization code tdc_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func tdc_customView() { avatarImgV.layer.cornerRadius = avatarImgV.width/2 avatarImgV.layer.masksToBounds = true // noLabel.backgroundColor = UIColor.blueColor } override func layoutSubviews() { // if(userNo < 3){ // // noLabel.textColor = UIColor.bfRedColor // nameLabel.textColor = UIColor.bfRedColor // // }else{ noLabel.textColor = UIColor.iOS11Black nameLabel.textColor = UIColor.iOS11Black // } // noLabel.sizeToFit() } } ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeSecCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeThirdCell.swift ================================================ // // BFUserTypeThirdCell.swift // BeeFun // // Created by WengHengcong on 3/10/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit class BFUserTypeThirdCell: BFBaseCell { @IBOutlet weak var tagImagV: UIImageView! @IBOutlet weak var infoLabel: UILabel! @IBOutlet weak var disImgV: UIImageView! var cellDic: [String: Any]? override func awakeFromNib() { super.awakeFromNib() // Initialization code duic_customView() } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func duic_customView() { super.p_customCellView() infoLabel.textColor = UIColor.iOS11Black } func duic_fillData(_ dic: [String:String]) { cellDic = dic tagImagV.image = UIImage(named: dic["img"]!) infoLabel.text = dic["desc"]! let disBool = NSString(string: dic["discolsure"]!).boolValue disImgV.isHidden = !disBool } } ================================================ FILE: BeeFun/BeeFun/View/User/UserCell/BFUserTypeThirdCell.xib ================================================ ================================================ FILE: BeeFun/BeeFun/View/User/View/CPDeveloperInfoView.swift ================================================ // // CPDeveloperInfoView.swift // BeeFun // // Created by WengHengcong on 3/10/16. // Copyright © 2016 JungleSong. All rights reserved. // import UIKit protocol UserProfileActionProtocol: class { func viewFollowAction() func viewReposAction() func viewFollowingAction() } class CPDeveloperInfoView: UIView { var avatarImgV: UIImageView = UIImageView() var nameLabel: UILabel = UILabel() var emailLabel: UILabel = UILabel() var followerBtn: UIButton = UIButton() var reposBtn: UIButton = UIButton() var followingBtn: UIButton = UIButton() weak var userActionDelegate: UserProfileActionProtocol? var developer: ObjUser? { didSet { div_fillData() } } override init(frame: CGRect) { super.init(frame: frame) div_customView() } init(obj: ObjUser) { super.init(frame: CGRect.zero) self.developer = obj } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func div_customView() { addSubview(avatarImgV) addSubview(nameLabel) addSubview(emailLabel) addSubview(followerBtn) addSubview(reposBtn) addSubview(followingBtn) backgroundColor = UIColor.white let imgW: CGFloat = 70.0 let imgX: CGFloat = (ScreenSize.width-imgW)/2.0 self.avatarImgV.layer.cornerRadius = imgW/2 self.avatarImgV.layer.masksToBounds = true avatarImgV.frame = CGRect(x: imgX, y: 16.0, width: imgW, height: imgW) nameLabel.frame = CGRect(x: 0, y: avatarImgV.bottom+6.0, width: ScreenSize.width, height: 21.0) nameLabel.font = UIFont.bfSystemFont(ofSize: 19.0) nameLabel.textColor = UIColor.iOS11Black nameLabel.textAlignment = .center emailLabel.frame = CGRect(x: 0, y: nameLabel.bottom+5.0, width: ScreenSize.width, height: 21.0) emailLabel.font = UIFont.bfSystemFont(ofSize: 14.0) emailLabel.textColor = UIColor.iOS11Black emailLabel.textAlignment = .center let imgEdgeInsets1 = UIEdgeInsets(top: 0, left: -5, bottom: 0, right: 10) let borderWidth: CGFloat = 0.5 let btnY = emailLabel.bottom+8.0 let btnW = ScreenSize.width/3.0 let btnH: CGFloat = 36.0 let btnArr1: [UIButton] = [followerBtn, reposBtn, followingBtn] for (index, btn) in btnArr1.enumerated() { let btnX = btnW*CGFloat(index) btn.frame = CGRect(x: btnX, y: btnY, width: btnW, height: btnH) btn.titleLabel?.font = UIFont.bfSystemFont(ofSize: 12.0) btn.backgroundColor = UIColor.white btn.imageEdgeInsets = imgEdgeInsets1 btn.layer.borderColor = UIColor.bfLineBackgroundColor.cgColor btn.layer.borderWidth = borderWidth btn.setTitleColor(UIColor.bfRedColor, for: UIControl.State()) btn.titleLabel?.numberOfLines = 0 btn.titleLabel?.textAlignment = .center } followerBtn.setTitle("0 \n"+"Follower".localized, for: UIControl.State()) followerBtn.addTarget(self, action: #selector(CPDeveloperInfoView.div_followAction), for: .touchUpInside) reposBtn.setTitle("0 \n"+"Repositories".localized, for: UIControl.State()) reposBtn.addTarget(self, action: #selector(CPDeveloperInfoView.div_reposAction), for: .touchUpInside) followingBtn.setTitle("0 \n"+"Following".localized, for: UIControl.State()) followingBtn.addTarget(self, action: #selector(CPDeveloperInfoView.div_followingAction), for: .touchUpInside) } func div_fillData() { if let avatarUrl = developer!.avatar_url { avatarImgV.kf.setImage(with: URL(string: avatarUrl)!) } nameLabel.text = developer!.name if let email = developer!.email { emailLabel.isHidden = false emailLabel.text = email } else { emailLabel.isHidden = true } if let followerCount = developer!.followers { followerBtn.setTitle("\(followerCount) \n"+"Follower".localized, for: UIControl.State()) } if let reposCount = developer!.public_repos { reposBtn.setTitle("\(reposCount) \n"+"Repositories".localized, for: UIControl.State()) } if let followingCount = developer!.following { followingBtn.setTitle("\(followingCount) \n"+"Following".localized, for: UIControl.State()) } } @objc func div_followAction() { if let followerCount = developer!.followers { if followerCount == 0 { return } } if self.userActionDelegate != nil { self.userActionDelegate!.viewFollowAction() } } @objc func div_reposAction() { if let reposCount = developer!.public_repos { if reposCount == 0 { return } } if self.userActionDelegate != nil { self.userActionDelegate!.viewReposAction() } } @objc func div_followingAction() { if let followingCount = developer!.following { if followingCount == 0 { return } } if self.userActionDelegate != nil { self.userActionDelegate!.viewFollowingAction() } } } ================================================ FILE: BeeFun/BeeFun/en.lproj/Main.storyboard ================================================ ================================================ FILE: BeeFun/BeeFun/zh-Hans.lproj/LaunchScreen.strings ================================================ ================================================ FILE: BeeFun/BeeFun.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 5E008CCC1F8DC0D80007850F /* JSMBProgressHud.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E008CCB1F8DC0D80007850F /* JSMBProgressHud.xcassets */; }; 5E03B08720C03D5200D3561E /* BFBaseViewController+Reload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E03B08620C03D5200D3561E /* BFBaseViewController+Reload.swift */; }; 5E0447D61F64BC57001DD0B7 /* SESearchBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447D51F64BC57001DD0B7 /* SESearchBaseModel.swift */; }; 5E0447E01F64E456001DD0B7 /* SEResponseRepos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447DE1F64E456001DD0B7 /* SEResponseRepos.swift */; }; 5E0447E11F64E456001DD0B7 /* SEResponseUsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447DF1F64E456001DD0B7 /* SEResponseUsers.swift */; }; 5E0447E31F64FB09001DD0B7 /* SEResponseIssues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447E21F64FB09001DD0B7 /* SEResponseIssues.swift */; }; 5E0447E51F64FB17001DD0B7 /* SEResponseCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447E41F64FB17001DD0B7 /* SEResponseCode.swift */; }; 5E0447E71F64FB22001DD0B7 /* SEResponseCommits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447E61F64FB22001DD0B7 /* SEResponseCommits.swift */; }; 5E0447E91F64FB2C001DD0B7 /* SEResponseWikis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447E81F64FB2C001DD0B7 /* SEResponseWikis.swift */; }; 5E0447F31F653177001DD0B7 /* BFBaseTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447EC1F653177001DD0B7 /* BFBaseTabBarController.swift */; }; 5E0447F41F653177001DD0B7 /* BFBaseViewController+Answer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447ED1F653177001DD0B7 /* BFBaseViewController+Answer.swift */; }; 5E0447F51F653177001DD0B7 /* BFBaseViewController+Nav.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447EE1F653177001DD0B7 /* BFBaseViewController+Nav.swift */; }; 5E0447F61F653177001DD0B7 /* BFBaseViewController+Refresh.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447EF1F653177001DD0B7 /* BFBaseViewController+Refresh.swift */; }; 5E0447F71F653177001DD0B7 /* BFBaseViewController+TableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447F01F653177001DD0B7 /* BFBaseViewController+TableView.swift */; }; 5E0447F81F653177001DD0B7 /* BFBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447F11F653177001DD0B7 /* BFBaseViewController.swift */; }; 5E0447F91F653177001DD0B7 /* BFWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447F21F653177001DD0B7 /* BFWebViewController.swift */; }; 5E0448031F6531B0001DD0B7 /* BFUserDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447FB1F6531B0001DD0B7 /* BFUserDetailController.swift */; }; 5E0448041F6531B0001DD0B7 /* BFUserListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0447FC1F6531B0001DD0B7 /* BFUserListController.swift */; }; 5E04482A1F657097001DD0B7 /* EventAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448291F657097001DD0B7 /* EventAPI.swift */; }; 5E04489F1F65ADD4001DD0B7 /* BFUserTypeOneCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448971F65ADD4001DD0B7 /* BFUserTypeOneCell.swift */; }; 5E0448A01F65ADD4001DD0B7 /* BFUserTypeOneCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E0448981F65ADD4001DD0B7 /* BFUserTypeOneCell.xib */; }; 5E0448A11F65ADD4001DD0B7 /* BFUserTypeSecCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448991F65ADD4001DD0B7 /* BFUserTypeSecCell.swift */; }; 5E0448A21F65ADD4001DD0B7 /* BFUserTypeSecCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E04489A1F65ADD4001DD0B7 /* BFUserTypeSecCell.xib */; }; 5E0448A31F65ADD4001DD0B7 /* BFUserTypeThirdCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E04489B1F65ADD4001DD0B7 /* BFUserTypeThirdCell.swift */; }; 5E0448A41F65ADD4001DD0B7 /* BFUserTypeThirdCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E04489C1F65ADD4001DD0B7 /* BFUserTypeThirdCell.xib */; }; 5E0448A51F65ADD4001DD0B7 /* CPDeveloperInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E04489E1F65ADD4001DD0B7 /* CPDeveloperInfoView.swift */; }; 5E0448B21F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448A71F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.swift */; }; 5E0448B31F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E0448A81F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.xib */; }; 5E0448B41F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448A91F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.swift */; }; 5E0448B51F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E0448AA1F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.xib */; }; 5E0448B61F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448AB1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.swift */; }; 5E0448B71F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E0448AC1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.xib */; }; 5E0448B81F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448AD1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.swift */; }; 5E0448B91F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E0448AE1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.xib */; }; 5E0448BA1F65ADE4001DD0B7 /* CPReposInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448B01F65ADE4001DD0B7 /* CPReposInfoView.swift */; }; 5E0448BB1F65ADE4001DD0B7 /* CPReposPosterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0448B11F65ADE4001DD0B7 /* CPReposPosterView.swift */; }; 5E048A70213159A20098CBF6 /* BFNewTrendingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E048A6F213159A20098CBF6 /* BFNewTrendingController.swift */; }; 5E0943931CC1F0020047118D /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E0943921CC1F0020047118D /* libicucore.tbd */; }; 5E0943951CC1F0100047118D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E0943941CC1F0100047118D /* libz.tbd */; }; 5E0943971CC1F01C0047118D /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E0943961CC1F01C0047118D /* libstdc++.tbd */; }; 5E0943991CC1F0220047118D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E0943981CC1F0220047118D /* JavaScriptCore.framework */; }; 5E09439B1CC1F02B0047118D /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E09439A1CC1F02B0047118D /* ImageIO.framework */; }; 5E09439D1CC1F0320047118D /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E09439C1CC1F0320047118D /* libsqlite3.tbd */; }; 5E09439F1CC1F03C0047118D /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E09439E1CC1F03C0047118D /* MessageUI.framework */; }; 5E0DDC731E72D4DB00493ABA /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E0DDC721E72D4DB00493ABA /* libc++.tbd */; }; 5E0FE5C91E8FFFDB00356232 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4431E8FFFDA00356232 /* AppDelegate.swift */; }; 5E0FE5CA1E8FFFDB00356232 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4441E8FFFDA00356232 /* Assets.xcassets */; }; 5E0FE5CC1E8FFFDB00356232 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4471E8FFFDA00356232 /* LaunchScreen.storyboard */; }; 5E0FE5CE1E8FFFDB00356232 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE44E1E8FFFDA00356232 /* Main.storyboard */; }; 5E0FE6051E8FFFDB00356232 /* DataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4901E8FFFDA00356232 /* DataModel.swift */; }; 5E0FE6061E8FFFDB00356232 /* ObjComment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4921E8FFFDA00356232 /* ObjComment.swift */; }; 5E0FE6071E8FFFDB00356232 /* ObjCommit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4931E8FFFDA00356232 /* ObjCommit.swift */; }; 5E0FE6081E8FFFDB00356232 /* ObjEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4941E8FFFDA00356232 /* ObjEvent.swift */; }; 5E0FE6091E8FFFDB00356232 /* ObjEventPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4951E8FFFDA00356232 /* ObjEventPayload.swift */; }; 5E0FE60A1E8FFFDB00356232 /* ObjNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4961E8FFFDA00356232 /* ObjNotification.swift */; }; 5E0FE60B1E8FFFDB00356232 /* ObjSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4971E8FFFDA00356232 /* ObjSubject.swift */; }; 5E0FE60C1E8FFFDB00356232 /* ObjIssue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4991E8FFFDA00356232 /* ObjIssue.swift */; }; 5E0FE60D1E8FFFDB00356232 /* ObjLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE49A1E8FFFDA00356232 /* ObjLabel.swift */; }; 5E0FE60E1E8FFFDB00356232 /* ObjMilestone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE49B1E8FFFDA00356232 /* ObjMilestone.swift */; }; 5E0FE6101E8FFFDB00356232 /* AppToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE49E1E8FFFDA00356232 /* AppToken.swift */; }; 5E0FE6111E8FFFDB00356232 /* ObjErropReponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE49F1E8FFFDA00356232 /* ObjErropReponse.swift */; }; 5E0FE6121E8FFFDB00356232 /* ObjError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4A01E8FFFDA00356232 /* ObjError.swift */; }; 5E0FE6131E8FFFDB00356232 /* ObjResponseHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4A11E8FFFDA00356232 /* ObjResponseHeader.swift */; }; 5E0FE6141E8FFFDB00356232 /* ObjResponser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4A21E8FFFDA00356232 /* ObjResponser.swift */; }; 5E0FE6151E8FFFDB00356232 /* ObjBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4A31E8FFFDA00356232 /* ObjBase.swift */; }; 5E0FE6161E8FFFDB00356232 /* ObjSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4A51E8FFFDA00356232 /* ObjSettings.swift */; }; 5E0FE6201E8FFFDB00356232 /* ObjShowcase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B21E8FFFDA00356232 /* ObjShowcase.swift */; }; 5E0FE6211E8FFFDB00356232 /* ObjEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B41E8FFFDA00356232 /* ObjEmail.swift */; }; 5E0FE6221E8FFFDB00356232 /* ObjPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B51E8FFFDA00356232 /* ObjPermissions.swift */; }; 5E0FE6231E8FFFDB00356232 /* ObjPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B61E8FFFDA00356232 /* ObjPlan.swift */; }; 5E0FE6241E8FFFDB00356232 /* ObjUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B71E8FFFDA00356232 /* ObjUser.swift */; }; 5E0FE6251E8FFFDB00356232 /* ObjUserSum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E0FE4B81E8FFFDA00356232 /* ObjUserSum.swift */; }; 5E0FE6301E8FFFDB00356232 /* tab_gist@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4C71E8FFFDA00356232 /* tab_gist@2x.png */; }; 5E0FE6311E8FFFDB00356232 /* tab_gist_sel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4C91E8FFFDA00356232 /* tab_gist_sel@2x.png */; }; 5E0FE6321E8FFFDB00356232 /* tab_hot@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4CC1E8FFFDA00356232 /* tab_hot@2x.png */; }; 5E0FE6331E8FFFDB00356232 /* tab_hot@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4CE1E8FFFDA00356232 /* tab_hot@3x.png */; }; 5E0FE6341E8FFFDB00356232 /* tab_hot_sel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4D01E8FFFDA00356232 /* tab_hot_sel@2x.png */; }; 5E0FE6351E8FFFDB00356232 /* tab_hot_sel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4D21E8FFFDA00356232 /* tab_hot_sel@3x.png */; }; 5E0FE6361E8FFFDB00356232 /* tab_me@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4D41E8FFFDA00356232 /* tab_me@2x.png */; }; 5E0FE6371E8FFFDB00356232 /* tab_me@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4D61E8FFFDA00356232 /* tab_me@3x.png */; }; 5E0FE6381E8FFFDB00356232 /* tab_me_sel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4D81E8FFFDA00356232 /* tab_me_sel@2x.png */; }; 5E0FE6391E8FFFDB00356232 /* tab_me_sel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4DA1E8FFFDA00356232 /* tab_me_sel@3x.png */; }; 5E0FE63A1E8FFFDB00356232 /* tab_mes@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4DC1E8FFFDA00356232 /* tab_mes@2x.png */; }; 5E0FE63B1E8FFFDB00356232 /* tab_mes@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4DE1E8FFFDA00356232 /* tab_mes@3x.png */; }; 5E0FE63C1E8FFFDB00356232 /* tab_mes_sel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4E01E8FFFDA00356232 /* tab_mes_sel@2x.png */; }; 5E0FE63D1E8FFFDB00356232 /* tab_mes_sel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4E21E8FFFDA00356232 /* tab_mes_sel@3x.png */; }; 5E0FE63E1E8FFFDB00356232 /* tab_star@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4E41E8FFFDA00356232 /* tab_star@2x.png */; }; 5E0FE63F1E8FFFDB00356232 /* tab_star@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4E61E8FFFDA00356232 /* tab_star@3x.png */; }; 5E0FE6401E8FFFDB00356232 /* tab_star_sel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4E81E8FFFDA00356232 /* tab_star_sel@2x.png */; }; 5E0FE6411E8FFFDB00356232 /* tab_star_sel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4EA1E8FFFDA00356232 /* tab_star_sel@3x.png */; }; 5E0FE6421E8FFFDB00356232 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE4FF1E8FFFDA00356232 /* Localizable.strings */; }; 5E0FE6431E8FFFDB00356232 /* BFAbout.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE5031E8FFFDA00356232 /* BFAbout.plist */; }; 5E0FE6451E8FFFDB00356232 /* CPCity.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE5071E8FFFDA00356232 /* CPCity.plist */; }; 5E0FE6461E8FFFDB00356232 /* CPCountry.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE5091E8FFFDA00356232 /* CPCountry.plist */; }; 5E0FE6471E8FFFDB00356232 /* CPFilterLanguage.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE50B1E8FFFDA00356232 /* CPFilterLanguage.plist */; }; 5E0FE6481E8FFFDB00356232 /* BFProfile.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE50D1E8FFFDA00356232 /* BFProfile.plist */; }; 5E0FE6491E8FFFDB00356232 /* BFSetting.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE50F1E8FFFDA00356232 /* BFSetting.plist */; }; 5E0FE6BD1E8FFFDB00356232 /* LaunchScreen.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5E0FE5C61E8FFFDB00356232 /* LaunchScreen.strings */; }; 5E1A28861F7A4CB300A60EE0 /* ObjMember.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A28851F7A4CB300A60EE0 /* ObjMember.swift */; }; 5E1A28881F7A7CFF00A60EE0 /* BFStarContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A28871F7A7CFF00A60EE0 /* BFStarContentView.swift */; }; 5E1A288A1F7A828D00A60EE0 /* BFStarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A28891F7A828D00A60EE0 /* BFStarController.swift */; }; 5E1A288C1F7A8C3C00A60EE0 /* BFStarController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A288B1F7A8C3C00A60EE0 /* BFStarController+View.swift */; }; 5E1A288E1F7A8CE300A60EE0 /* BFStarController+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A288D1F7A8CE300A60EE0 /* BFStarController+Data.swift */; }; 5E1A28901F7A98DC00A60EE0 /* BFStarController+Noti.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A288F1F7A98DC00A60EE0 /* BFStarController+Noti.swift */; }; 5E1A28921F7B15F300A60EE0 /* BFTabbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E1A28911F7B15F300A60EE0 /* BFTabbarManager.swift */; }; 5E2074E11F69955100B15203 /* BFMessageConentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E2074E01F69955100B15203 /* BFMessageConentView.swift */; }; 5E21B22E1F8CA61E002AC902 /* JSSVPHUDBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E21B22D1F8CA61E002AC902 /* JSSVPHUDBridge.swift */; }; 5E260E9020CB9EC70075B8C3 /* JPushManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E260E8F20CB9EC70075B8C3 /* JPushManager.swift */; }; 5E2816BF1FCCFE9D007A5159 /* MOBFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816991FCCFE9D007A5159 /* MOBFoundation.framework */; }; 5E2816C01FCCFE9D007A5159 /* ShareSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E28169B1FCCFE9D007A5159 /* ShareSDK.framework */; }; 5E2816C11FCCFE9D007A5159 /* ShareSDKConfigFile.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5E28169E1FCCFE9D007A5159 /* ShareSDKConfigFile.bundle */; }; 5E2816C21FCCFE9D007A5159 /* ShareSDKConfigFile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E28169F1FCCFE9D007A5159 /* ShareSDKConfigFile.framework */; }; 5E2816C31FCCFE9D007A5159 /* ShareSDKExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A01FCCFE9D007A5159 /* ShareSDKExtension.framework */; }; 5E2816C41FCCFE9D007A5159 /* ShareSDKUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5E2816A11FCCFE9D007A5159 /* ShareSDKUI.bundle */; }; 5E2816C51FCCFE9D007A5159 /* ShareSDKUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A21FCCFE9D007A5159 /* ShareSDKUI.framework */; }; 5E2816C61FCCFE9D007A5159 /* FacebookConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A41FCCFE9D007A5159 /* FacebookConnector.framework */; }; 5E2816C71FCCFE9D007A5159 /* MailConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A51FCCFE9D007A5159 /* MailConnector.framework */; }; 5E2816C81FCCFE9D007A5159 /* QQConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A61FCCFE9D007A5159 /* QQConnector.framework */; }; 5E2816C91FCCFE9D007A5159 /* SinaWeiboConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A71FCCFE9D007A5159 /* SinaWeiboConnector.framework */; }; 5E2816CA1FCCFE9D007A5159 /* TwitterConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A81FCCFE9D007A5159 /* TwitterConnector.framework */; }; 5E2816CB1FCCFE9D007A5159 /* WechatConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816A91FCCFE9D007A5159 /* WechatConnector.framework */; }; 5E2816CC1FCCFE9D007A5159 /* TencentOpenAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816AC1FCCFE9D007A5159 /* TencentOpenAPI.framework */; }; 5E2816CD1FCCFE9D007A5159 /* TencentOpenApi_IOS_Bundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5E2816AD1FCCFE9D007A5159 /* TencentOpenApi_IOS_Bundle.bundle */; }; 5E2816CE1FCCFE9D007A5159 /* libWeiboSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816AF1FCCFE9D007A5159 /* libWeiboSDK.a */; }; 5E2816CF1FCCFE9D007A5159 /* WeiboSDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5E2816B31FCCFE9D007A5159 /* WeiboSDK.bundle */; }; 5E2816D01FCCFE9D007A5159 /* libWeChatSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816B61FCCFE9D007A5159 /* libWeChatSDK.a */; }; 5E2816D11FCCFE9D007A5159 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5E2816B71FCCFE9D007A5159 /* README.txt */; }; 5E2816D21FCCFE9D007A5159 /* ShareSDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5E2816BC1FCCFE9D007A5159 /* ShareSDK.bundle */; }; 5E2816D31FCCFE9D007A5159 /* ShareSDKConnector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816BD1FCCFE9D007A5159 /* ShareSDKConnector.framework */; }; 5E2816D41FCCFE9D007A5159 /* UMMobClick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E2816BE1FCCFE9D007A5159 /* UMMobClick.framework */; }; 5E47F69E1F79F15100D24180 /* ObjRelease.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E47F69D1F79F15100D24180 /* ObjRelease.swift */; }; 5E47F6A01F7A07AC00D24180 /* ObjAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E47F69F1F7A07AC00D24180 /* ObjAsset.swift */; }; 5E47F6A21F7A28F700D24180 /* ObjDeployment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E47F6A11F7A28F700D24180 /* ObjDeployment.swift */; }; 5E47F6A41F7A29D000D24180 /* ObjDeploymentPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E47F6A31F7A29D000D24180 /* ObjDeploymentPayload.swift */; }; 5E51F6571F7CB95C000DC150 /* SESearchResultContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E51F6561F7CB95C000DC150 /* SESearchResultContentView.swift */; }; 5E51F6591F7CD984000DC150 /* SESearchResultController+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E51F6581F7CD984000DC150 /* SESearchResultController+Action.swift */; }; 5E66326020D8BED5008F922D /* beefuntop.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 5E66325F20D8BED5008F922D /* beefuntop.p12 */; }; 5E6AE53F1F91742A00813B6C /* Event.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E6AE53E1F91742A00813B6C /* Event.xcassets */; }; 5E6AE5411F9178A500813B6C /* ObjPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6AE5401F9178A500813B6C /* ObjPage.swift */; }; 5E6C24AE20EFBA1D00373ED9 /* BFFeedbackIssueController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6C24AD20EFBA1D00373ED9 /* BFFeedbackIssueController.swift */; }; 5E6C24B020EFBFEB00373ED9 /* BFFeedbackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6C24AF20EFBFEB00373ED9 /* BFFeedbackManager.swift */; }; 5E73686C1E77D4CC00AEBA77 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E73686B1E77D4CC00AEBA77 /* CFNetwork.framework */; }; 5E73686E1E77D4FE00AEBA77 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E73686D1E77D4FE00AEBA77 /* UserNotifications.framework */; }; 5E7368701E77D50F00AEBA77 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E73686F1E77D50F00AEBA77 /* libresolv.tbd */; }; 5E737AFB1F59696E00C0E28D /* BFBaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737A851F59696E00C0E28D /* BFBaseCell.swift */; }; 5E737AFC1F59696E00C0E28D /* BFSwipeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737A861F59696E00C0E28D /* BFSwipeCell.swift */; }; 5E737B0B1F59696E00C0E28D /* BFGistViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737A9B1F59696E00C0E28D /* BFGistViewController.swift */; }; 5E737B0C1F59696E00C0E28D /* CPMesIssueCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737A9E1F59696E00C0E28D /* CPMesIssueCell.swift */; }; 5E737B0D1F59696E00C0E28D /* CPMesIssueCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737A9F1F59696E00C0E28D /* CPMesIssueCell.xib */; }; 5E737B0F1F59696E00C0E28D /* BFMessageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AA21F59696E00C0E28D /* BFMessageController.swift */; }; 5E737B111F59696E00C0E28D /* CPMesNotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AA61F59696E00C0E28D /* CPMesNotificationCell.swift */; }; 5E737B121F59696E00C0E28D /* CPMesNotificationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737AA71F59696E00C0E28D /* CPMesNotificationCell.xib */; }; 5E737B131F59696E00C0E28D /* BFProfileController+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AA91F59696E00C0E28D /* BFProfileController+Data.swift */; }; 5E737B141F59696E00C0E28D /* BFProfileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AAA1F59696E00C0E28D /* BFProfileController.swift */; }; 5E737B151F59696E00C0E28D /* CPFunnyAwardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AAC1F59696E00C0E28D /* CPFunnyAwardViewController.swift */; }; 5E737B161F59696E00C0E28D /* BFFunnyLabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AAD1F59696E00C0E28D /* BFFunnyLabViewController.swift */; }; 5E737B171F59696E00C0E28D /* BFAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AAF1F59696E00C0E28D /* BFAboutViewController.swift */; }; 5E737B181F59696E00C0E28D /* BFSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AB01F59696E00C0E28D /* BFSettingsViewController.swift */; }; 5E737B191F59696E00C0E28D /* BFAddNewTagsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AB21F59696E00C0E28D /* BFAddNewTagsController.swift */; }; 5E737B1A1F59696E00C0E28D /* BFListsManageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AB31F59696E00C0E28D /* BFListsManageController.swift */; }; 5E737B1C1F59696E00C0E28D /* BFTagsManageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AB51F59696E00C0E28D /* BFTagsManageController.swift */; }; 5E737B1D1F59696E00C0E28D /* BFEditUserController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AB71F59696E00C0E28D /* BFEditUserController.swift */; }; 5E737B211F59696E00C0E28D /* CPPersonCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737ABC1F59696E00C0E28D /* CPPersonCardView.swift */; }; 5E737B241F59696E00C0E28D /* BFRepoDetailController+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AC01F59696E00C0E28D /* BFRepoDetailController+Data.swift */; }; 5E737B251F59696E00C0E28D /* BFRepoDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AC11F59696E00C0E28D /* BFRepoDetailController.swift */; }; 5E737B261F59696E00C0E28D /* BFRepoListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AC21F59696E00C0E28D /* BFRepoListController.swift */; }; 5E737B2B1F59696E00C0E28D /* SESearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AC91F59696E00C0E28D /* SESearchViewController.swift */; }; 5E737B341F59696E00C0E28D /* BFStarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AD61F59696E00C0E28D /* BFStarViewModel.swift */; }; 5E737B351F59696E00C0E28D /* JSSegmentControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AD71F59696E00C0E28D /* JSSegmentControl.swift */; }; 5E737B361F59696E00C0E28D /* BFUpdateTagsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AD91F59696E00C0E28D /* BFUpdateTagsController.swift */; }; 5E737B371F59696E00C0E28D /* ListScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737ADB1F59696E00C0E28D /* ListScrollView.swift */; }; 5E737B381F59696E00C0E28D /* AddTagsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737ADD1F59696E00C0E28D /* AddTagsCell.swift */; }; 5E737B391F59696E00C0E28D /* AddTagsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737ADE1F59696E00C0E28D /* AddTagsCell.xib */; }; 5E737B3A1F59696E00C0E28D /* JSScrollContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737ADF1F59696E00C0E28D /* JSScrollContentView.swift */; }; 5E737B3B1F59696E00C0E28D /* JSTagBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE01F59696E00C0E28D /* JSTagBar.swift */; }; 5E737B3C1F59696E00C0E28D /* JSTagItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE11F59696E00C0E28D /* JSTagItem.swift */; }; 5E737B3E1F59696E00C0E28D /* ShowTagsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE31F59696E00C0E28D /* ShowTagsCell.swift */; }; 5E737B3F1F59696E00C0E28D /* BFShowcaseDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE51F59696E00C0E28D /* BFShowcaseDetailController.swift */; }; 5E737B401F59696E00C0E28D /* BFTrendingController+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE61F59696E00C0E28D /* BFTrendingController+Data.swift */; }; 5E737B411F59696E00C0E28D /* BFTrendingController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE71F59696E00C0E28D /* BFTrendingController+View.swift */; }; 5E737B421F59696E00C0E28D /* BFTrendingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AE81F59696E00C0E28D /* BFTrendingController.swift */; }; 5E737B431F59696E00C0E28D /* BFShowcaseHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AEA1F59696E00C0E28D /* BFShowcaseHeaderView.swift */; }; 5E737B441F59696E00C0E28D /* BFShowcaseHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737AEB1F59696E00C0E28D /* BFShowcaseHeaderView.xib */; }; 5E737B491F59696E00C0E28D /* BFTrendingShowcaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AF01F59696E00C0E28D /* BFTrendingShowcaseCell.swift */; }; 5E737B4A1F59696E00C0E28D /* BFTrendingShowcaseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737AF11F59696E00C0E28D /* BFTrendingShowcaseCell.xib */; }; 5E737B4B1F59696E00C0E28D /* CPFilterTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AF21F59696E00C0E28D /* CPFilterTableView.swift */; }; 5E737B4C1F59696E00C0E28D /* InfoButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737AF31F59696E00C0E28D /* InfoButton.swift */; }; 5E737B7A1F596A1300C0E28D /* AnswerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B4F1F596A1300C0E28D /* AnswerManager.swift */; }; 5E737B7B1F596A1300C0E28D /* BFGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B501F596A1300C0E28D /* BFGlobalHelper.swift */; }; 5E737B7C1F596A1300C0E28D /* JumpManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B511F596A1300C0E28D /* JumpManager.swift */; }; 5E737B7D1F596A1300C0E28D /* KPIManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B521F596A1300C0E28D /* KPIManager.swift */; }; 5E737B7E1F596A1300C0E28D /* MJRefreshManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B531F596A1300C0E28D /* MJRefreshManager.swift */; }; 5E737B7F1F596A1300C0E28D /* BFNetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B541F596A1300C0E28D /* BFNetworkManager.swift */; }; 5E737B801F596A1300C0E28D /* PayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B551F596A1300C0E28D /* PayManager.swift */; }; 5E737B811F596A1300C0E28D /* PlistHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B561F596A1300C0E28D /* PlistHelper.swift */; }; 5E737B821F596A1300C0E28D /* PurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B571F596A1300C0E28D /* PurchaseManager.swift */; }; 5E737B831F596A1300C0E28D /* ShareManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B581F596A1300C0E28D /* ShareManager.swift */; }; 5E737B841F596A1300C0E28D /* BFTimeHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B591F596A1300C0E28D /* BFTimeHelper.swift */; }; 5E737B851F596A1300C0E28D /* UserManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B5A1F596A1300C0E28D /* UserManager.swift */; }; 5E737B871F596A1300C0E28D /* GitHubAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B5D1F596A1300C0E28D /* GitHubAPI.swift */; }; 5E737B881F596A1300C0E28D /* IssueAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B5E1F596A1300C0E28D /* IssueAPI.swift */; }; 5E737B8A1F596A1300C0E28D /* LanguageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B601F596A1300C0E28D /* LanguageManager.swift */; }; 5E737B8B1F596A1300C0E28D /* Response+ObjectMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B611F596A1300C0E28D /* Response+ObjectMapper.swift */; }; 5E737B8D1F596A1300C0E28D /* SVGProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B631F596A1300C0E28D /* SVGProcessor.swift */; }; 5E737B8E1F596A1300C0E28D /* TrendingManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B641F596A1300C0E28D /* TrendingManager.swift */; }; 5E737B8F1F596A1300C0E28D /* BFCommonString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B661F596A1300C0E28D /* BFCommonString.swift */; }; 5E737B901F596A1300C0E28D /* BFNotificationName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B671F596A1300C0E28D /* BFNotificationName.swift */; }; 5E737B911F596A1300C0E28D /* BFStyleGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B681F596A1300C0E28D /* BFStyleGuide.swift */; }; 5E737B921F596A1300C0E28D /* BFThirdLibKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B691F596A1300C0E28D /* BFThirdLibKey.swift */; }; 5E737B931F596A1300C0E28D /* UIColor+Project.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B6A1F596A1300C0E28D /* UIColor+Project.swift */; }; 5E737B941F596A1300C0E28D /* UIFont+Project.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B6B1F596A1300C0E28D /* UIFont+Project.swift */; }; 5E737B981F596A1300C0E28D /* SQLHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B711F596A1300C0E28D /* SQLHelper.swift */; }; 5E737B991F596A1300C0E28D /* SQLLists.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B721F596A1300C0E28D /* SQLLists.swift */; }; 5E737B9A1F596A1300C0E28D /* SQLManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B731F596A1300C0E28D /* SQLManager.swift */; }; 5E737B9E1F596A1300C0E28D /* ObjList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737B781F596A1300C0E28D /* ObjList.swift */; }; 5E737C291F596A1D00C0E28D /* JSHMSegmentedBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BA31F596A1D00C0E28D /* JSHMSegmentedBridge.swift */; }; 5E737C2B1F596A1D00C0E28D /* JSSQLiteSwiftBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BA51F596A1D00C0E28D /* JSSQLiteSwiftBridge.swift */; }; 5E737C2C1F596A1D00C0E28D /* JSSwiftyBeaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BA61F596A1D00C0E28D /* JSSwiftyBeaver.swift */; }; 5E737C2E1F596A1D00C0E28D /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAA1F596A1D00C0E28D /* Array+Extension.swift */; }; 5E737C2F1F596A1D00C0E28D /* Bundle+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAB1F596A1D00C0E28D /* Bundle+Extension.swift */; }; 5E737C301F596A1D00C0E28D /* Character+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAC1F596A1D00C0E28D /* Character+Extension.swift */; }; 5E737C311F596A1D00C0E28D /* Data+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAD1F596A1D00C0E28D /* Data+Extension.swift */; }; 5E737C321F596A1D00C0E28D /* Dictionary+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAE1F596A1D00C0E28D /* Dictionary+Extension.swift */; }; 5E737C331F596A1D00C0E28D /* JSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BAF1F596A1D00C0E28D /* JSApp.swift */; }; 5E737C341F596A1D00C0E28D /* JSAssociatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB01F596A1D00C0E28D /* JSAssociatedObject.swift */; }; 5E737C351F596A1D00C0E28D /* JSClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB11F596A1D00C0E28D /* JSClass.swift */; }; 5E737C361F596A1D00C0E28D /* JSDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB21F596A1D00C0E28D /* JSDebug.swift */; }; 5E737C371F596A1D00C0E28D /* JSFoundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB31F596A1D00C0E28D /* JSFoundation.swift */; }; 5E737C381F596A1D00C0E28D /* JSFoundationGlobal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB41F596A1D00C0E28D /* JSFoundationGlobal.swift */; }; 5E737C391F596A1D00C0E28D /* JSGCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB51F596A1D00C0E28D /* JSGCD.swift */; }; 5E737C3A1F596A1D00C0E28D /* JSLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB61F596A1D00C0E28D /* JSLanguage.swift */; }; 5E737C3B1F596A1D00C0E28D /* JSObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB71F596A1D00C0E28D /* JSObject.swift */; }; 5E737C3C1F596A1D00C0E28D /* NSAttributedString+Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB81F596A1D00C0E28D /* NSAttributedString+Size.swift */; }; 5E737C3D1F596A1D00C0E28D /* NSObject+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BB91F596A1D00C0E28D /* NSObject+Extension.swift */; }; 5E737C3E1F596A1D00C0E28D /* NSString+Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BBA1F596A1D00C0E28D /* NSString+Size.swift */; }; 5E737C401F596A1D00C0E28D /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BBC1F596A1D00C0E28D /* String+Extension.swift */; }; 5E737C431F596A1D00C0E28D /* JSCommentStyleGudie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BC21F596A1D00C0E28D /* JSCommentStyleGudie.swift */; }; 5E737C451F596A1D00C0E28D /* JSBaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BC61F596A1D00C0E28D /* JSBaseCell.swift */; }; 5E737C461F596A1D00C0E28D /* JSCellDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BC71F596A1D00C0E28D /* JSCellDefine.swift */; }; 5E737C471F596A1D00C0E28D /* JSCellFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BC81F596A1D00C0E28D /* JSCellFactory.swift */; }; 5E737C481F596A1D00C0E28D /* JSCellModel+Init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BC91F596A1D00C0E28D /* JSCellModel+Init.swift */; }; 5E737C491F596A1D00C0E28D /* JSCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BCA1F596A1D00C0E28D /* JSCellModel.swift */; }; 5E737C4A1F596A1D00C0E28D /* JSCellModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BCB1F596A1D00C0E28D /* JSCellModelFactory.swift */; }; 5E737C4B1F596A1D00C0E28D /* JSCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BCC1F596A1D00C0E28D /* JSCellProtocol.swift */; }; 5E737C4C1F596A1D00C0E28D /* JSCellUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BCD1F596A1D00C0E28D /* JSCellUtils.swift */; }; 5E737C4D1F596A1D00C0E28D /* JSEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BCE1F596A1D00C0E28D /* JSEditCell.swift */; }; 5E737C4E1F596A1D00C0E28D /* JSEditCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BCF1F596A1D00C0E28D /* JSEditCell.xib */; }; 5E737C4F1F596A1D00C0E28D /* JSImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BD01F596A1D00C0E28D /* JSImageCell.swift */; }; 5E737C501F596A1D00C0E28D /* JSImageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BD11F596A1D00C0E28D /* JSImageCell.xib */; }; 5E737C511F596A1D00C0E28D /* JSLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BD21F596A1D00C0E28D /* JSLabelCell.swift */; }; 5E737C521F596A1D00C0E28D /* JSLabelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BD31F596A1D00C0E28D /* JSLabelCell.xib */; }; 5E737C531F596A1D00C0E28D /* JSSelectedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BD41F596A1D00C0E28D /* JSSelectedCell.swift */; }; 5E737C541F596A1D00C0E28D /* JSSelectedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BD51F596A1D00C0E28D /* JSSelectedCell.xib */; }; 5E737C551F596A1D00C0E28D /* JSSubLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BD61F596A1D00C0E28D /* JSSubLabelCell.swift */; }; 5E737C561F596A1D00C0E28D /* JSSubLabelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BD71F596A1D00C0E28D /* JSSubLabelCell.xib */; }; 5E737C571F596A1D00C0E28D /* JSSwitchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BD81F596A1D00C0E28D /* JSSwitchCell.swift */; }; 5E737C581F596A1D00C0E28D /* JSSwitchCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BD91F596A1D00C0E28D /* JSSwitchCell.xib */; }; 5E737C5A1F596A1D00C0E28D /* TableViewCell.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E737BDB1F596A1D00C0E28D /* TableViewCell.xcassets */; }; 5E737C5B1F596A1D00C0E28D /* CGRect+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BDD1F596A1D00C0E28D /* CGRect+Extension.swift */; }; 5E737C5C1F596A1D00C0E28D /* JSApperence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BDE1F596A1D00C0E28D /* JSApperence.swift */; }; 5E737C5D1F596A1D00C0E28D /* JSApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BDF1F596A1D00C0E28D /* JSApplication.swift */; }; 5E737C5E1F596A1D00C0E28D /* JSCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE01F596A1D00C0E28D /* JSCollectionViewCell.swift */; }; 5E737C5F1F596A1D00C0E28D /* JSDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE11F596A1D00C0E28D /* JSDevice.swift */; }; 5E737C601F596A1D00C0E28D /* JSFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE21F596A1D00C0E28D /* JSFileManager.swift */; }; 5E737C611F596A1D00C0E28D /* JSNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE31F596A1D00C0E28D /* JSNavigationController.swift */; }; 5E737C621F596A1D00C0E28D /* JSTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE41F596A1D00C0E28D /* JSTabBarController.swift */; }; 5E737C641F596A1D00C0E28D /* JSUIGlobal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE61F596A1D00C0E28D /* JSUIGlobal.swift */; }; 5E737C651F596A1D00C0E28D /* JSUIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE71F596A1D00C0E28D /* JSUIKit.swift */; }; 5E737C661F596A1D00C0E28D /* JSViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE81F596A1D00C0E28D /* JSViewController.swift */; }; 5E737C671F596A1D00C0E28D /* NSMutableAttributedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BE91F596A1D00C0E28D /* NSMutableAttributedString.swift */; }; 5E737C691F596A1D00C0E28D /* UIAlertController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BEB1F596A1D00C0E28D /* UIAlertController+Extension.swift */; }; 5E737C6A1F596A1D00C0E28D /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BEC1F596A1D00C0E28D /* UIColor+Extension.swift */; }; 5E737C6B1F596A1D00C0E28D /* UIDevice+Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BED1F596A1D00C0E28D /* UIDevice+Device.swift */; }; 5E737C6C1F596A1D00C0E28D /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BEE1F596A1D00C0E28D /* UIImage+Extension.swift */; }; 5E737C6D1F596A1D00C0E28D /* UILabel+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BEF1F596A1D00C0E28D /* UILabel+Extension.swift */; }; 5E737C6E1F596A1D00C0E28D /* UILabel+Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF01F596A1D00C0E28D /* UILabel+Size.swift */; }; 5E737C6F1F596A1D00C0E28D /* UINavigationController+Pop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF11F596A1D00C0E28D /* UINavigationController+Pop.swift */; }; 5E737C701F596A1D00C0E28D /* UIScreen+Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF21F596A1D00C0E28D /* UIScreen+Size.swift */; }; 5E737C711F596A1D00C0E28D /* UIStoryboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF31F596A1D00C0E28D /* UIStoryboard+Extension.swift */; }; 5E737C721F596A1D00C0E28D /* UITextField+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF41F596A1D00C0E28D /* UITextField+Extension.swift */; }; 5E737C731F596A1D00C0E28D /* UIView+Draw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF51F596A1D00C0E28D /* UIView+Draw.swift */; }; 5E737C741F596A1D00C0E28D /* UIView+Nib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737BF61F596A1D00C0E28D /* UIView+Nib.swift */; }; 5E737C8F1F5E143B00C0E28D /* SESearchResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737C8E1F5E143B00C0E28D /* SESearchResultController.swift */; }; 5E737C911F5E36EB00C0E28D /* JSUtilis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E737C901F5E36EB00C0E28D /* JSUtilis.swift */; }; 5E7691FE1CC2323C00E0C2D3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7691FD1CC2323C00E0C2D3 /* Security.framework */; }; 5E7692001CC2326F00E0C2D3 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7691FF1CC2326F00E0C2D3 /* SystemConfiguration.framework */; }; 5E7692021CC2327B00E0C2D3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692011CC2327B00E0C2D3 /* CoreGraphics.framework */; }; 5E7692041CC2328B00E0C2D3 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692031CC2328B00E0C2D3 /* CoreTelephony.framework */; }; 5E7692061CC2329100E0C2D3 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692051CC2329100E0C2D3 /* libiconv.tbd */; }; 5E7692081CC2436D00E0C2D3 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692071CC2436D00E0C2D3 /* AdSupport.framework */; }; 5E76920A1CC2448D00E0C2D3 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692091CC2448D00E0C2D3 /* CoreData.framework */; }; 5E76920C1CC2449700E0C2D3 /* Accounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E76920B1CC2449700E0C2D3 /* Accounts.framework */; }; 5E76920E1CC244A500E0C2D3 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E76920D1CC244A500E0C2D3 /* OpenGLES.framework */; }; 5E7692101CC244B500E0C2D3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E76920F1CC244B500E0C2D3 /* QuartzCore.framework */; }; 5E7692121CC2453300E0C2D3 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7692111CC2453300E0C2D3 /* Social.framework */; }; 5E8C117A1F6140810015B0FE /* SESearchViewController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8C11791F6140810015B0FE /* SESearchViewController+View.swift */; }; 5E8C117C1F6142990015B0FE /* SESearchOrderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8C117B1F6142990015B0FE /* SESearchOrderButton.swift */; }; 5E8C117E1F6144B90015B0FE /* SearchModule.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E8C117D1F6144B90015B0FE /* SearchModule.xcassets */; }; 5E8C11801F6144FA0015B0FE /* ProfileModule.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E8C117F1F6144FA0015B0FE /* ProfileModule.xcassets */; }; 5E8E4F3B209B52430067CF39 /* GetAllTagResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8E4F3A209B52430067CF39 /* GetAllTagResponse.swift */; }; 5E8E4F3D209B52610067CF39 /* ObjTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8E4F3C209B52610067CF39 /* ObjTag.swift */; }; 5E8FCF4422C2075C00817E6F /* BFExploreNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF3F22C2075C00817E6F /* BFExploreNavigationModel.swift */; }; 5E8FCF4522C2075C00817E6F /* BFGihubTrendingTimeEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF4022C2075C00817E6F /* BFGihubTrendingTimeEnum.swift */; }; 5E8FCF4622C2075D00817E6F /* BFGithubTrendingUserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF4122C2075C00817E6F /* BFGithubTrendingUserModel.swift */; }; 5E8FCF4722C2075D00817E6F /* BFGithubTrendingRequsetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF4222C2075C00817E6F /* BFGithubTrendingRequsetModel.swift */; }; 5E8FCF4822C2075D00817E6F /* BFGithubTrengingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF4322C2075C00817E6F /* BFGithubTrengingModel.swift */; }; 5E8FCF4F22C2128800817E6F /* BeeFunTrendingResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF4E22C2128800817E6F /* BeeFunTrendingResponseModel.swift */; }; 5E8FCF5122C21B3600817E6F /* NetFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF5022C21B3600817E6F /* NetFilter.swift */; }; 5E8FCF5322C22BD100817E6F /* BeeFunResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8FCF5222C22BD000817E6F /* BeeFunResponseModel.swift */; }; 5E95E75C1E8F2D2C006C80BE /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E95E75B1E8F2D2C006C80BE /* MobileCoreServices.framework */; }; 5E98162520D8B837002DD1EE /* IdentityAndTrust.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E98162420D8B837002DD1EE /* IdentityAndTrust.swift */; }; 5EA054EB208CD6BA009922AE /* BeeFunAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA054EA208CD6BA009922AE /* BeeFunAPI.swift */; }; 5EA1B6501F8CFF5D00DFAB7F /* JSMBHUDBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA1B64F1F8CFF5D00DFAB7F /* JSMBHUDBridge.swift */; }; 5EA3BF3A20A9CCCE00D3CC79 /* BeeFunDBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA3BF3920A9CCCE00D3CC79 /* BeeFunDBManager.swift */; }; 5EA61E761F7E2DDC00AD8ACC /* BFEventParase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E751F7E2DDC00AD8ACC /* BFEventParase.swift */; }; 5EA61E7F1F7E327200AD8ACC /* BFEventCommitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E781F7E327200AD8ACC /* BFEventCommitView.swift */; }; 5EA61E801F7E327200AD8ACC /* BFEventPRDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E791F7E327200AD8ACC /* BFEventPRDetailView.swift */; }; 5EA61E811F7E327200AD8ACC /* BFEventTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E7A1F7E327200AD8ACC /* BFEventTextView.swift */; }; 5EA61E821F7E327200AD8ACC /* BFEventTimeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E7B1F7E327200AD8ACC /* BFEventTimeView.swift */; }; 5EA61E831F7E327200AD8ACC /* BFEventTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E7C1F7E327200AD8ACC /* BFEventTitleView.swift */; }; 5EA61E841F7E327200AD8ACC /* BFEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E7D1F7E327200AD8ACC /* BFEventView.swift */; }; 5EA61E851F7E327200AD8ACC /* BFImageViewAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA61E7E1F7E327200AD8ACC /* BFImageViewAttachment.swift */; }; 5EAC2F0B20201953000442FE /* BFZipManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F0A20201953000442FE /* BFZipManager.swift */; }; 5EAC2F0D202019CD000442FE /* BFPathManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F0C202019CD000442FE /* BFPathManager.swift */; }; 5EAC2F0F20201A2C000442FE /* SQLConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F0E20201A2C000442FE /* SQLConnection.swift */; }; 5EAC2F1220205462000442FE /* BFMonitor+Handle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F1020205462000442FE /* BFMonitor+Handle.swift */; }; 5EAC2F1320205462000442FE /* BFMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F1120205462000442FE /* BFMonitor.swift */; }; 5EAC2F152020679E000442FE /* BFUserDefaultManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F142020679E000442FE /* BFUserDefaultManager.swift */; }; 5EAC2F252022FC3F000442FE /* SQLStar+Update.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F1F2022FC3E000442FE /* SQLStar+Update.swift */; }; 5EAC2F262022FC3F000442FE /* SQLStars+Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F202022FC3E000442FE /* SQLStars+Base.swift */; }; 5EAC2F272022FC3F000442FE /* SQLStar+Delete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F212022FC3E000442FE /* SQLStar+Delete.swift */; }; 5EAC2F282022FC3F000442FE /* SQLStars+Find.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F222022FC3F000442FE /* SQLStars+Find.swift */; }; 5EAC2F292022FC3F000442FE /* SQLTags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F232022FC3F000442FE /* SQLTags.swift */; }; 5EAC2F2A2022FC3F000442FE /* SQLStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAC2F242022FC3F000442FE /* SQLStars.swift */; }; 5EAEF74A20EC5C6900DB76BC /* BFFeedbackController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAEF74920EC5C6900DB76BC /* BFFeedbackController.swift */; }; 5EAF8D56209E01CE004D256B /* BFStatusCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAF8D55209E01CE004D256B /* BFStatusCode.swift */; }; 5EAF8D8B20A6A651004D256B /* GetReposResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAF8D8A20A6A651004D256B /* GetReposResponse.swift */; }; 5EAF8D9120A6D2D2004D256B /* ObjRepos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAF8D9020A6D2D2004D256B /* ObjRepos.swift */; }; 5EB357121F76095600734A01 /* BFEventCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB357111F76095600734A01 /* BFEventCell.swift */; }; 5EB357141F76096200734A01 /* BFEventLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB357131F76096200734A01 /* BFEventLayout.swift */; }; 5EB357161F760A0C00734A01 /* BFEventBaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB357151F760A0C00734A01 /* BFEventBaseCell.swift */; }; 5EB357281F76B90700734A01 /* BFEventConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB357271F76B90700734A01 /* BFEventConstants.swift */; }; 5EB3572A1F773DBB00734A01 /* DispatchQueue+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB357291F773DBB00734A01 /* DispatchQueue+Extension.swift */; }; 5EB55D0A1F61483600D6CB25 /* SESearchResultController+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB55D091F61483600D6CB25 /* SESearchResultController+View.swift */; }; 5EB55D0D1F6187A700D6CB25 /* BFPopularLanguage.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EB55D0F1F6187A700D6CB25 /* BFPopularLanguage.plist */; }; 5EB824561F63727E006EB085 /* BFPlistResourcesKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB824551F63727E006EB085 /* BFPlistResourcesKey.swift */; }; 5EB8245A1F637F54006EB085 /* SearchAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB824591F637F54006EB085 /* SearchAPI.swift */; }; 5EB8245C1F638C8D006EB085 /* SESearchRepoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB8245B1F638C8D006EB085 /* SESearchRepoModel.swift */; }; 5EB8245E1F638C9B006EB085 /* SESearchUserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB8245D1F638C9B006EB085 /* SESearchUserModel.swift */; }; 5EB824601F638CAA006EB085 /* SESearchWikiModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB8245F1F638CAA006EB085 /* SESearchWikiModel.swift */; }; 5EB824621F638CB6006EB085 /* SESearchCodeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB824611F638CB6006EB085 /* SESearchCodeModel.swift */; }; 5EB824641F638CCB006EB085 /* SESearchIssueModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB824631F638CCB006EB085 /* SESearchIssueModel.swift */; }; 5EB824661F638CEC006EB085 /* SESearchCommitModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB824651F638CEC006EB085 /* SESearchCommitModel.swift */; }; 5EBA24D9201D82C100F097ED /* OAuthGithubWebController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBA24D7201D82C000F097ED /* OAuthGithubWebController.swift */; }; 5EBA24DA201D82C100F097ED /* OAuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBA24D8201D82C100F097ED /* OAuthManager.swift */; }; 5EBAAE1F1F90AC29007BBAA8 /* BFTrendingSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBAAE1E1F90AC29007BBAA8 /* BFTrendingSearchBar.swift */; }; 5EBAAE211F90B9CA007BBAA8 /* JSSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBAAE201F90B9CA007BBAA8 /* JSSearchBar.swift */; }; 5EBEC3F220D943CC00ABDD4D /* BFReposSyncController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBEC3F120D943CC00ABDD4D /* BFReposSyncController.swift */; }; 5EBEC3F520D9446F00ABDD4D /* BFRepoSync.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EBEC3F720D9446F00ABDD4D /* BFRepoSync.plist */; }; 5EBEC3FA20D95BCB00ABDD4D /* BFLanunchManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBEC3F920D95BCB00ABDD4D /* BFLanunchManager.swift */; }; 5EC1F33720C2339E00792C93 /* BFBaseViewController+Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EC1F33620C2339E00792C93 /* BFBaseViewController+Empty.swift */; }; 5EC1F33920C23B3700792C93 /* BFPlaceHolderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EC1F33820C23B3700792C93 /* BFPlaceHolderView.swift */; }; 5ECAE4FE201EB9A100DB6AD5 /* ObjGithubStarRepos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ECAE4FB201EB9A100DB6AD5 /* ObjGithubStarRepos.swift */; }; 5ECAE4FF201EB9A100DB6AD5 /* ObjReposSum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ECAE4FC201EB9A100DB6AD5 /* ObjReposSum.swift */; }; 5ECDD2191FD6725200A7E4F7 /* BFDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ECDD2181FD6725200A7E4F7 /* BFDocument.swift */; }; 5EDCB1211F14EA0200DC844D /* BFLanguage.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EDCB1231F14EA0200DC844D /* BFLanguage.plist */; }; 5EE0117A1F6CA58100F3AF3B /* YYTextManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EE011791F6CA58100F3AF3B /* YYTextManager.swift */; }; 5EE6438820D8F4B300F47E43 /* BFMessageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EE6438720D8F4B300F47E43 /* BFMessageManager.swift */; }; 5EF3C04D1E9007C700BDB8B0 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EF3C04C1E9007C700BDB8B0 /* StoreKit.framework */; }; 5EF837D41F66DF28009D4C09 /* ObjSearchCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EF837D31F66DF28009D4C09 /* ObjSearchCode.swift */; }; 5EF837D61F66E10E009D4C09 /* SESearchCodeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EF837D51F66E10E009D4C09 /* SESearchCodeCell.swift */; }; 5EFC7B021F90A504006D5139 /* InsetNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFC7B011F90A504006D5139 /* InsetNavigationBar.swift */; }; 5EFDFA5920C25D5200998B84 /* BFEmptyDataCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDFA5820C25D5200998B84 /* BFEmptyDataCell.swift */; }; 5EFDFA5B20C2E48300998B84 /* BFBaseViewController+Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDFA5A20C2E48300998B84 /* BFBaseViewController+Login.swift */; }; 5EFDFA5D20C2F1ED00998B84 /* BFBaseViewController+Noti.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFDFA5C20C2F1ED00998B84 /* BFBaseViewController+Noti.swift */; }; 5EFE2C721F6B3E140040FC3C /* ObjPullRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE2C711F6B3E140040FC3C /* ObjPullRequest.swift */; }; 5EFE2C761F6B42A40040FC3C /* ObjBranch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE2C751F6B42A40040FC3C /* ObjBranch.swift */; }; 5EFE2C781F6B44750040FC3C /* ObjLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE2C771F6B44750040FC3C /* ObjLinks.swift */; }; 5EFE2C7A1F6B45520040FC3C /* ObjHref.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE2C791F6B45520040FC3C /* ObjHref.swift */; }; B1AD3185D8591195BE15CE1F /* Pods_BeeFun.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5E816C288376FF8745B070 /* Pods_BeeFun.framework */; }; FE26BCBD1C4231FB00887534 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE26BCBC1C4231FB00887534 /* Alamofire.framework */; }; FE26BCC61C44754C00887534 /* ObjectMapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE26BCC51C44754C00887534 /* ObjectMapper.framework */; }; FE37DEF71C4A8F1F00B8449D /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FE37DEF61C4A8F1F00B8449D /* Kingfisher.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 1E8CC865E56BA5C5F2757091 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28BC2F5A583018320065668C /* Pods-BeeFun.achoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeFun.achoc.xcconfig"; path = "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.achoc.xcconfig"; sourceTree = ""; }; 29E3608C6B9F8CEB6E8B525C /* Pods_Coderpursue.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Coderpursue.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5E008CCB1F8DC0D80007850F /* JSMBProgressHud.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = JSMBProgressHud.xcassets; sourceTree = ""; }; 5E03B08620C03D5200D3561E /* BFBaseViewController+Reload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Reload.swift"; sourceTree = ""; }; 5E0447D51F64BC57001DD0B7 /* SESearchBaseModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchBaseModel.swift; sourceTree = ""; }; 5E0447DE1F64E456001DD0B7 /* SEResponseRepos.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseRepos.swift; sourceTree = ""; }; 5E0447DF1F64E456001DD0B7 /* SEResponseUsers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseUsers.swift; sourceTree = ""; }; 5E0447E21F64FB09001DD0B7 /* SEResponseIssues.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseIssues.swift; sourceTree = ""; }; 5E0447E41F64FB17001DD0B7 /* SEResponseCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseCode.swift; sourceTree = ""; }; 5E0447E61F64FB22001DD0B7 /* SEResponseCommits.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseCommits.swift; sourceTree = ""; }; 5E0447E81F64FB2C001DD0B7 /* SEResponseWikis.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SEResponseWikis.swift; sourceTree = ""; }; 5E0447EC1F653177001DD0B7 /* BFBaseTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFBaseTabBarController.swift; sourceTree = ""; }; 5E0447ED1F653177001DD0B7 /* BFBaseViewController+Answer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Answer.swift"; sourceTree = ""; }; 5E0447EE1F653177001DD0B7 /* BFBaseViewController+Nav.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Nav.swift"; sourceTree = ""; }; 5E0447EF1F653177001DD0B7 /* BFBaseViewController+Refresh.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Refresh.swift"; sourceTree = ""; }; 5E0447F01F653177001DD0B7 /* BFBaseViewController+TableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+TableView.swift"; sourceTree = ""; }; 5E0447F11F653177001DD0B7 /* BFBaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFBaseViewController.swift; sourceTree = ""; }; 5E0447F21F653177001DD0B7 /* BFWebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFWebViewController.swift; sourceTree = ""; }; 5E0447FB1F6531B0001DD0B7 /* BFUserDetailController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUserDetailController.swift; sourceTree = ""; }; 5E0447FC1F6531B0001DD0B7 /* BFUserListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUserListController.swift; sourceTree = ""; }; 5E0448291F657097001DD0B7 /* EventAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventAPI.swift; sourceTree = ""; }; 5E0448971F65ADD4001DD0B7 /* BFUserTypeOneCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUserTypeOneCell.swift; sourceTree = ""; }; 5E0448981F65ADD4001DD0B7 /* BFUserTypeOneCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFUserTypeOneCell.xib; sourceTree = ""; }; 5E0448991F65ADD4001DD0B7 /* BFUserTypeSecCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUserTypeSecCell.swift; sourceTree = ""; }; 5E04489A1F65ADD4001DD0B7 /* BFUserTypeSecCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFUserTypeSecCell.xib; sourceTree = ""; }; 5E04489B1F65ADD4001DD0B7 /* BFUserTypeThirdCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUserTypeThirdCell.swift; sourceTree = ""; }; 5E04489C1F65ADD4001DD0B7 /* BFUserTypeThirdCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFUserTypeThirdCell.xib; sourceTree = ""; }; 5E04489E1F65ADD4001DD0B7 /* CPDeveloperInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPDeveloperInfoView.swift; sourceTree = ""; }; 5E0448A71F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepositoryTypeFourCell.swift; sourceTree = ""; }; 5E0448A81F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFRepositoryTypeFourCell.xib; sourceTree = ""; }; 5E0448A91F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepositoryTypeOneCell.swift; sourceTree = ""; }; 5E0448AA1F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFRepositoryTypeOneCell.xib; sourceTree = ""; }; 5E0448AB1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepositoryTypeSecCell.swift; sourceTree = ""; }; 5E0448AC1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFRepositoryTypeSecCell.xib; sourceTree = ""; }; 5E0448AD1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepositoryTypeThirdCell.swift; sourceTree = ""; }; 5E0448AE1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFRepositoryTypeThirdCell.xib; sourceTree = ""; }; 5E0448B01F65ADE4001DD0B7 /* CPReposInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPReposInfoView.swift; sourceTree = ""; }; 5E0448B11F65ADE4001DD0B7 /* CPReposPosterView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPReposPosterView.swift; sourceTree = ""; }; 5E048A6F213159A20098CBF6 /* BFNewTrendingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFNewTrendingController.swift; sourceTree = ""; }; 5E0943921CC1F0020047118D /* libicucore.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libicucore.tbd; path = usr/lib/libicucore.tbd; sourceTree = SDKROOT; }; 5E0943941CC1F0100047118D /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 5E0943961CC1F01C0047118D /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; }; 5E0943981CC1F0220047118D /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 5E09439A1CC1F02B0047118D /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; 5E09439C1CC1F0320047118D /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; 5E09439E1CC1F03C0047118D /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; 5E0DDC721E72D4DB00493ABA /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 5E0FE4431E8FFFDA00356232 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 5E0FE4441E8FFFDA00356232 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5E0FE4481E8FFFDA00356232 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 5E0FE4491E8FFFDA00356232 /* BeeFun-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BeeFun-Bridging-Header.h"; sourceTree = ""; }; 5E0FE44F1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = ""; }; 5E0FE4501E8FFFDA00356232 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5E0FE4901E8FFFDA00356232 /* DataModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataModel.swift; sourceTree = ""; }; 5E0FE4921E8FFFDA00356232 /* ObjComment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjComment.swift; sourceTree = ""; }; 5E0FE4931E8FFFDA00356232 /* ObjCommit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjCommit.swift; sourceTree = ""; }; 5E0FE4941E8FFFDA00356232 /* ObjEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjEvent.swift; sourceTree = ""; }; 5E0FE4951E8FFFDA00356232 /* ObjEventPayload.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjEventPayload.swift; sourceTree = ""; }; 5E0FE4961E8FFFDA00356232 /* ObjNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjNotification.swift; sourceTree = ""; }; 5E0FE4971E8FFFDA00356232 /* ObjSubject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjSubject.swift; sourceTree = ""; }; 5E0FE4991E8FFFDA00356232 /* ObjIssue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjIssue.swift; sourceTree = ""; }; 5E0FE49A1E8FFFDA00356232 /* ObjLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjLabel.swift; sourceTree = ""; }; 5E0FE49B1E8FFFDA00356232 /* ObjMilestone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjMilestone.swift; sourceTree = ""; }; 5E0FE49E1E8FFFDA00356232 /* AppToken.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppToken.swift; sourceTree = ""; }; 5E0FE49F1E8FFFDA00356232 /* ObjErropReponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjErropReponse.swift; sourceTree = ""; }; 5E0FE4A01E8FFFDA00356232 /* ObjError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjError.swift; sourceTree = ""; }; 5E0FE4A11E8FFFDA00356232 /* ObjResponseHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjResponseHeader.swift; sourceTree = ""; }; 5E0FE4A21E8FFFDA00356232 /* ObjResponser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjResponser.swift; sourceTree = ""; }; 5E0FE4A31E8FFFDA00356232 /* ObjBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjBase.swift; sourceTree = ""; }; 5E0FE4A51E8FFFDA00356232 /* ObjSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjSettings.swift; sourceTree = ""; }; 5E0FE4B21E8FFFDA00356232 /* ObjShowcase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjShowcase.swift; sourceTree = ""; }; 5E0FE4B41E8FFFDA00356232 /* ObjEmail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjEmail.swift; sourceTree = ""; }; 5E0FE4B51E8FFFDA00356232 /* ObjPermissions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjPermissions.swift; sourceTree = ""; }; 5E0FE4B61E8FFFDA00356232 /* ObjPlan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjPlan.swift; sourceTree = ""; }; 5E0FE4B71E8FFFDA00356232 /* ObjUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjUser.swift; sourceTree = ""; }; 5E0FE4B81E8FFFDA00356232 /* ObjUserSum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjUserSum.swift; sourceTree = ""; }; 5E0FE4C81E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_gist@2x.png"; sourceTree = ""; }; 5E0FE4CA1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_gist_sel@2x.png"; sourceTree = ""; }; 5E0FE4CD1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_hot@2x.png"; sourceTree = ""; }; 5E0FE4CF1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_hot@3x.png"; sourceTree = ""; }; 5E0FE4D11E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_hot_sel@2x.png"; sourceTree = ""; }; 5E0FE4D31E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_hot_sel@3x.png"; sourceTree = ""; }; 5E0FE4D51E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_me@2x.png"; sourceTree = ""; }; 5E0FE4D71E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_me@3x.png"; sourceTree = ""; }; 5E0FE4D91E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_me_sel@2x.png"; sourceTree = ""; }; 5E0FE4DB1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_me_sel@3x.png"; sourceTree = ""; }; 5E0FE4DD1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_mes@2x.png"; sourceTree = ""; }; 5E0FE4DF1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_mes@3x.png"; sourceTree = ""; }; 5E0FE4E11E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_mes_sel@2x.png"; sourceTree = ""; }; 5E0FE4E31E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_mes_sel@3x.png"; sourceTree = ""; }; 5E0FE4E51E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_star@2x.png"; sourceTree = ""; }; 5E0FE4E71E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_star@3x.png"; sourceTree = ""; }; 5E0FE4E91E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_star_sel@2x.png"; sourceTree = ""; }; 5E0FE4EB1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = en; path = "en.lproj/tab_star_sel@3x.png"; sourceTree = ""; }; 5E0FE4EC1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_hot@2x.png"; sourceTree = ""; }; 5E0FE4ED1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_hot@3x.png"; sourceTree = ""; }; 5E0FE4EE1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_hot_sel@2x.png"; sourceTree = ""; }; 5E0FE4EF1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_hot_sel@3x.png"; sourceTree = ""; }; 5E0FE4F01E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_me@2x.png"; sourceTree = ""; }; 5E0FE4F11E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_me@3x.png"; sourceTree = ""; }; 5E0FE4F21E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_me_sel@2x.png"; sourceTree = ""; }; 5E0FE4F31E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_me_sel@3x.png"; sourceTree = ""; }; 5E0FE4F41E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_mes@2x.png"; sourceTree = ""; }; 5E0FE4F51E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_mes@3x.png"; sourceTree = ""; }; 5E0FE4F61E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_mes_sel@2x.png"; sourceTree = ""; }; 5E0FE4F71E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_mes_sel@3x.png"; sourceTree = ""; }; 5E0FE4F81E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_star@2x.png"; sourceTree = ""; }; 5E0FE4F91E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_star@3x.png"; sourceTree = ""; }; 5E0FE4FA1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_star_sel@2x.png"; sourceTree = ""; }; 5E0FE4FB1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_star_sel@3x.png"; sourceTree = ""; }; 5E0FE4FC1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_gist@2x.png"; sourceTree = ""; }; 5E0FE4FD1E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "zh-Hans"; path = "zh-Hans.lproj/tab_gist_sel@2x.png"; sourceTree = ""; }; 5E0FE5001E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 5E0FE5011E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 5E0FE5041E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFAbout.plist; sourceTree = ""; }; 5E0FE5081E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/CPCity.plist; sourceTree = ""; }; 5E0FE50A1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/CPCountry.plist; sourceTree = ""; }; 5E0FE50C1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/CPFilterLanguage.plist; sourceTree = ""; }; 5E0FE50E1E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFProfile.plist; sourceTree = ""; }; 5E0FE5101E8FFFDA00356232 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFSetting.plist; sourceTree = ""; }; 5E0FE5111E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFAbout.plist"; sourceTree = ""; }; 5E0FE5131E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/CPCity.plist"; sourceTree = ""; }; 5E0FE5141E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/CPCountry.plist"; sourceTree = ""; }; 5E0FE5161E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFProfile.plist"; sourceTree = ""; }; 5E0FE5171E8FFFDA00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFSetting.plist"; sourceTree = ""; }; 5E0FE5C71E8FFFDB00356232 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; 5E1A28851F7A4CB300A60EE0 /* ObjMember.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjMember.swift; sourceTree = ""; }; 5E1A28871F7A7CFF00A60EE0 /* BFStarContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFStarContentView.swift; sourceTree = ""; }; 5E1A28891F7A828D00A60EE0 /* BFStarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFStarController.swift; sourceTree = ""; }; 5E1A288B1F7A8C3C00A60EE0 /* BFStarController+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFStarController+View.swift"; sourceTree = ""; }; 5E1A288D1F7A8CE300A60EE0 /* BFStarController+Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFStarController+Data.swift"; sourceTree = ""; }; 5E1A288F1F7A98DC00A60EE0 /* BFStarController+Noti.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFStarController+Noti.swift"; sourceTree = ""; }; 5E1A28911F7B15F300A60EE0 /* BFTabbarManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFTabbarManager.swift; sourceTree = ""; }; 5E2074E01F69955100B15203 /* BFMessageConentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFMessageConentView.swift; sourceTree = ""; }; 5E21B22D1F8CA61E002AC902 /* JSSVPHUDBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSVPHUDBridge.swift; sourceTree = ""; }; 5E260E8F20CB9EC70075B8C3 /* JPushManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JPushManager.swift; sourceTree = ""; }; 5E2816991FCCFE9D007A5159 /* MOBFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MOBFoundation.framework; sourceTree = ""; }; 5E28169B1FCCFE9D007A5159 /* ShareSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ShareSDK.framework; sourceTree = ""; }; 5E28169E1FCCFE9D007A5159 /* ShareSDKConfigFile.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = ShareSDKConfigFile.bundle; sourceTree = ""; }; 5E28169F1FCCFE9D007A5159 /* ShareSDKConfigFile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ShareSDKConfigFile.framework; sourceTree = ""; }; 5E2816A01FCCFE9D007A5159 /* ShareSDKExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ShareSDKExtension.framework; sourceTree = ""; }; 5E2816A11FCCFE9D007A5159 /* ShareSDKUI.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = ShareSDKUI.bundle; sourceTree = ""; }; 5E2816A21FCCFE9D007A5159 /* ShareSDKUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ShareSDKUI.framework; sourceTree = ""; }; 5E2816A41FCCFE9D007A5159 /* FacebookConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FacebookConnector.framework; sourceTree = ""; }; 5E2816A51FCCFE9D007A5159 /* MailConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MailConnector.framework; sourceTree = ""; }; 5E2816A61FCCFE9D007A5159 /* QQConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QQConnector.framework; sourceTree = ""; }; 5E2816A71FCCFE9D007A5159 /* SinaWeiboConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SinaWeiboConnector.framework; sourceTree = ""; }; 5E2816A81FCCFE9D007A5159 /* TwitterConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TwitterConnector.framework; sourceTree = ""; }; 5E2816A91FCCFE9D007A5159 /* WechatConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WechatConnector.framework; sourceTree = ""; }; 5E2816AC1FCCFE9D007A5159 /* TencentOpenAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TencentOpenAPI.framework; sourceTree = ""; }; 5E2816AD1FCCFE9D007A5159 /* TencentOpenApi_IOS_Bundle.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = TencentOpenApi_IOS_Bundle.bundle; sourceTree = ""; }; 5E2816AF1FCCFE9D007A5159 /* libWeiboSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWeiboSDK.a; sourceTree = ""; }; 5E2816B01FCCFE9D007A5159 /* WBHttpRequest+WeiboToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WBHttpRequest+WeiboToken.h"; sourceTree = ""; }; 5E2816B11FCCFE9D007A5159 /* WBHttpRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WBHttpRequest.h; sourceTree = ""; }; 5E2816B21FCCFE9D007A5159 /* WeiboSDK+Statistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "WeiboSDK+Statistics.h"; sourceTree = ""; }; 5E2816B31FCCFE9D007A5159 /* WeiboSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = WeiboSDK.bundle; sourceTree = ""; }; 5E2816B41FCCFE9D007A5159 /* WeiboSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeiboSDK.h; sourceTree = ""; }; 5E2816B61FCCFE9D007A5159 /* libWeChatSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWeChatSDK.a; sourceTree = ""; }; 5E2816B71FCCFE9D007A5159 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = ""; }; 5E2816B81FCCFE9D007A5159 /* WechatAuthSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WechatAuthSDK.h; sourceTree = ""; }; 5E2816B91FCCFE9D007A5159 /* WXApi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApi.h; sourceTree = ""; }; 5E2816BA1FCCFE9D007A5159 /* WXApiObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApiObject.h; sourceTree = ""; }; 5E2816BC1FCCFE9D007A5159 /* ShareSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = ShareSDK.bundle; sourceTree = ""; }; 5E2816BD1FCCFE9D007A5159 /* ShareSDKConnector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ShareSDKConnector.framework; sourceTree = ""; }; 5E2816BE1FCCFE9D007A5159 /* UMMobClick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMMobClick.framework; sourceTree = ""; }; 5E47F69D1F79F15100D24180 /* ObjRelease.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjRelease.swift; sourceTree = ""; }; 5E47F69F1F7A07AC00D24180 /* ObjAsset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjAsset.swift; sourceTree = ""; }; 5E47F6A11F7A28F700D24180 /* ObjDeployment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjDeployment.swift; sourceTree = ""; }; 5E47F6A31F7A29D000D24180 /* ObjDeploymentPayload.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjDeploymentPayload.swift; sourceTree = ""; }; 5E51F6561F7CB95C000DC150 /* SESearchResultContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchResultContentView.swift; sourceTree = ""; }; 5E51F6581F7CD984000DC150 /* SESearchResultController+Action.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SESearchResultController+Action.swift"; sourceTree = ""; }; 5E6116AF1F0E25560030EBF0 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/CPFilterLanguage.plist"; sourceTree = ""; }; 5E66325F20D8BED5008F922D /* beefuntop.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = beefuntop.p12; sourceTree = ""; }; 5E6AE53E1F91742A00813B6C /* Event.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Event.xcassets; sourceTree = ""; }; 5E6AE5401F9178A500813B6C /* ObjPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjPage.swift; sourceTree = ""; }; 5E6C24AD20EFBA1D00373ED9 /* BFFeedbackIssueController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFFeedbackIssueController.swift; sourceTree = ""; }; 5E6C24AF20EFBFEB00373ED9 /* BFFeedbackManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFFeedbackManager.swift; sourceTree = ""; }; 5E73686B1E77D4CC00AEBA77 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 5E73686D1E77D4FE00AEBA77 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; 5E73686F1E77D50F00AEBA77 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; 5E737A851F59696E00C0E28D /* BFBaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFBaseCell.swift; sourceTree = ""; }; 5E737A861F59696E00C0E28D /* BFSwipeCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFSwipeCell.swift; sourceTree = ""; }; 5E737A9B1F59696E00C0E28D /* BFGistViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGistViewController.swift; sourceTree = ""; }; 5E737A9E1F59696E00C0E28D /* CPMesIssueCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPMesIssueCell.swift; sourceTree = ""; }; 5E737A9F1F59696E00C0E28D /* CPMesIssueCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CPMesIssueCell.xib; sourceTree = ""; }; 5E737AA21F59696E00C0E28D /* BFMessageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFMessageController.swift; sourceTree = ""; }; 5E737AA61F59696E00C0E28D /* CPMesNotificationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPMesNotificationCell.swift; sourceTree = ""; }; 5E737AA71F59696E00C0E28D /* CPMesNotificationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CPMesNotificationCell.xib; sourceTree = ""; }; 5E737AA91F59696E00C0E28D /* BFProfileController+Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFProfileController+Data.swift"; sourceTree = ""; }; 5E737AAA1F59696E00C0E28D /* BFProfileController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFProfileController.swift; sourceTree = ""; }; 5E737AAC1F59696E00C0E28D /* CPFunnyAwardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPFunnyAwardViewController.swift; sourceTree = ""; }; 5E737AAD1F59696E00C0E28D /* BFFunnyLabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFFunnyLabViewController.swift; sourceTree = ""; }; 5E737AAF1F59696E00C0E28D /* BFAboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFAboutViewController.swift; sourceTree = ""; }; 5E737AB01F59696E00C0E28D /* BFSettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFSettingsViewController.swift; sourceTree = ""; }; 5E737AB21F59696E00C0E28D /* BFAddNewTagsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFAddNewTagsController.swift; sourceTree = ""; }; 5E737AB31F59696E00C0E28D /* BFListsManageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFListsManageController.swift; sourceTree = ""; }; 5E737AB51F59696E00C0E28D /* BFTagsManageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFTagsManageController.swift; sourceTree = ""; }; 5E737AB71F59696E00C0E28D /* BFEditUserController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEditUserController.swift; sourceTree = ""; }; 5E737ABC1F59696E00C0E28D /* CPPersonCardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPPersonCardView.swift; sourceTree = ""; }; 5E737AC01F59696E00C0E28D /* BFRepoDetailController+Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFRepoDetailController+Data.swift"; sourceTree = ""; }; 5E737AC11F59696E00C0E28D /* BFRepoDetailController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepoDetailController.swift; sourceTree = ""; }; 5E737AC21F59696E00C0E28D /* BFRepoListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFRepoListController.swift; sourceTree = ""; }; 5E737AC91F59696E00C0E28D /* SESearchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchViewController.swift; sourceTree = ""; }; 5E737AD61F59696E00C0E28D /* BFStarViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFStarViewModel.swift; sourceTree = ""; }; 5E737AD71F59696E00C0E28D /* JSSegmentControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSegmentControl.swift; sourceTree = ""; }; 5E737AD91F59696E00C0E28D /* BFUpdateTagsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFUpdateTagsController.swift; sourceTree = ""; }; 5E737ADB1F59696E00C0E28D /* ListScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListScrollView.swift; sourceTree = ""; }; 5E737ADD1F59696E00C0E28D /* AddTagsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddTagsCell.swift; sourceTree = ""; }; 5E737ADE1F59696E00C0E28D /* AddTagsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AddTagsCell.xib; sourceTree = ""; }; 5E737ADF1F59696E00C0E28D /* JSScrollContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSScrollContentView.swift; sourceTree = ""; }; 5E737AE01F59696E00C0E28D /* JSTagBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSTagBar.swift; sourceTree = ""; }; 5E737AE11F59696E00C0E28D /* JSTagItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSTagItem.swift; sourceTree = ""; }; 5E737AE31F59696E00C0E28D /* ShowTagsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowTagsCell.swift; sourceTree = ""; }; 5E737AE51F59696E00C0E28D /* BFShowcaseDetailController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFShowcaseDetailController.swift; sourceTree = ""; }; 5E737AE61F59696E00C0E28D /* BFTrendingController+Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFTrendingController+Data.swift"; sourceTree = ""; }; 5E737AE71F59696E00C0E28D /* BFTrendingController+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFTrendingController+View.swift"; sourceTree = ""; }; 5E737AE81F59696E00C0E28D /* BFTrendingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFTrendingController.swift; sourceTree = ""; }; 5E737AEA1F59696E00C0E28D /* BFShowcaseHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFShowcaseHeaderView.swift; sourceTree = ""; }; 5E737AEB1F59696E00C0E28D /* BFShowcaseHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFShowcaseHeaderView.xib; sourceTree = ""; }; 5E737AF01F59696E00C0E28D /* BFTrendingShowcaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFTrendingShowcaseCell.swift; sourceTree = ""; }; 5E737AF11F59696E00C0E28D /* BFTrendingShowcaseCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BFTrendingShowcaseCell.xib; sourceTree = ""; }; 5E737AF21F59696E00C0E28D /* CPFilterTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPFilterTableView.swift; sourceTree = ""; }; 5E737AF31F59696E00C0E28D /* InfoButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InfoButton.swift; sourceTree = ""; }; 5E737B4F1F596A1300C0E28D /* AnswerManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnswerManager.swift; sourceTree = ""; }; 5E737B501F596A1300C0E28D /* BFGlobalHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGlobalHelper.swift; sourceTree = ""; }; 5E737B511F596A1300C0E28D /* JumpManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JumpManager.swift; sourceTree = ""; }; 5E737B521F596A1300C0E28D /* KPIManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KPIManager.swift; sourceTree = ""; }; 5E737B531F596A1300C0E28D /* MJRefreshManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MJRefreshManager.swift; sourceTree = ""; }; 5E737B541F596A1300C0E28D /* BFNetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFNetworkManager.swift; sourceTree = ""; }; 5E737B551F596A1300C0E28D /* PayManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PayManager.swift; sourceTree = ""; }; 5E737B561F596A1300C0E28D /* PlistHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlistHelper.swift; sourceTree = ""; }; 5E737B571F596A1300C0E28D /* PurchaseManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurchaseManager.swift; sourceTree = ""; }; 5E737B581F596A1300C0E28D /* ShareManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareManager.swift; sourceTree = ""; }; 5E737B591F596A1300C0E28D /* BFTimeHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFTimeHelper.swift; sourceTree = ""; }; 5E737B5A1F596A1300C0E28D /* UserManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserManager.swift; sourceTree = ""; }; 5E737B5D1F596A1300C0E28D /* GitHubAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitHubAPI.swift; sourceTree = ""; }; 5E737B5E1F596A1300C0E28D /* IssueAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssueAPI.swift; sourceTree = ""; }; 5E737B601F596A1300C0E28D /* LanguageManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageManager.swift; sourceTree = ""; }; 5E737B611F596A1300C0E28D /* Response+ObjectMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Response+ObjectMapper.swift"; sourceTree = ""; }; 5E737B631F596A1300C0E28D /* SVGProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SVGProcessor.swift; sourceTree = ""; }; 5E737B641F596A1300C0E28D /* TrendingManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrendingManager.swift; sourceTree = ""; }; 5E737B661F596A1300C0E28D /* BFCommonString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFCommonString.swift; sourceTree = ""; }; 5E737B671F596A1300C0E28D /* BFNotificationName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFNotificationName.swift; sourceTree = ""; }; 5E737B681F596A1300C0E28D /* BFStyleGuide.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFStyleGuide.swift; sourceTree = ""; }; 5E737B691F596A1300C0E28D /* BFThirdLibKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFThirdLibKey.swift; sourceTree = ""; }; 5E737B6A1F596A1300C0E28D /* UIColor+Project.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Project.swift"; sourceTree = ""; }; 5E737B6B1F596A1300C0E28D /* UIFont+Project.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIFont+Project.swift"; sourceTree = ""; }; 5E737B711F596A1300C0E28D /* SQLHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLHelper.swift; sourceTree = ""; }; 5E737B721F596A1300C0E28D /* SQLLists.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLLists.swift; sourceTree = ""; }; 5E737B731F596A1300C0E28D /* SQLManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLManager.swift; sourceTree = ""; }; 5E737B781F596A1300C0E28D /* ObjList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjList.swift; sourceTree = ""; }; 5E737BA31F596A1D00C0E28D /* JSHMSegmentedBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSHMSegmentedBridge.swift; sourceTree = ""; }; 5E737BA51F596A1D00C0E28D /* JSSQLiteSwiftBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSQLiteSwiftBridge.swift; sourceTree = ""; }; 5E737BA61F596A1D00C0E28D /* JSSwiftyBeaver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSwiftyBeaver.swift; sourceTree = ""; }; 5E737BAA1F596A1D00C0E28D /* Array+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; 5E737BAB1F596A1D00C0E28D /* Bundle+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Extension.swift"; sourceTree = ""; }; 5E737BAC1F596A1D00C0E28D /* Character+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Character+Extension.swift"; sourceTree = ""; }; 5E737BAD1F596A1D00C0E28D /* Data+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+Extension.swift"; sourceTree = ""; }; 5E737BAE1F596A1D00C0E28D /* Dictionary+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+Extension.swift"; sourceTree = ""; }; 5E737BAF1F596A1D00C0E28D /* JSApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSApp.swift; sourceTree = ""; }; 5E737BB01F596A1D00C0E28D /* JSAssociatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSAssociatedObject.swift; sourceTree = ""; }; 5E737BB11F596A1D00C0E28D /* JSClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSClass.swift; sourceTree = ""; }; 5E737BB21F596A1D00C0E28D /* JSDebug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSDebug.swift; sourceTree = ""; }; 5E737BB31F596A1D00C0E28D /* JSFoundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSFoundation.swift; sourceTree = ""; }; 5E737BB41F596A1D00C0E28D /* JSFoundationGlobal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSFoundationGlobal.swift; sourceTree = ""; }; 5E737BB51F596A1D00C0E28D /* JSGCD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSGCD.swift; sourceTree = ""; }; 5E737BB61F596A1D00C0E28D /* JSLanguage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSLanguage.swift; sourceTree = ""; }; 5E737BB71F596A1D00C0E28D /* JSObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSObject.swift; sourceTree = ""; }; 5E737BB81F596A1D00C0E28D /* NSAttributedString+Size.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAttributedString+Size.swift"; sourceTree = ""; }; 5E737BB91F596A1D00C0E28D /* NSObject+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+Extension.swift"; sourceTree = ""; }; 5E737BBA1F596A1D00C0E28D /* NSString+Size.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSString+Size.swift"; sourceTree = ""; }; 5E737BBB1F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737BBC1F596A1D00C0E28D /* String+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; 5E737BBE1F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737BC21F596A1D00C0E28D /* JSCommentStyleGudie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCommentStyleGudie.swift; sourceTree = ""; }; 5E737BC31F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737BC61F596A1D00C0E28D /* JSBaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSBaseCell.swift; sourceTree = ""; }; 5E737BC71F596A1D00C0E28D /* JSCellDefine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellDefine.swift; sourceTree = ""; }; 5E737BC81F596A1D00C0E28D /* JSCellFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellFactory.swift; sourceTree = ""; }; 5E737BC91F596A1D00C0E28D /* JSCellModel+Init.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JSCellModel+Init.swift"; sourceTree = ""; }; 5E737BCA1F596A1D00C0E28D /* JSCellModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellModel.swift; sourceTree = ""; }; 5E737BCB1F596A1D00C0E28D /* JSCellModelFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellModelFactory.swift; sourceTree = ""; }; 5E737BCC1F596A1D00C0E28D /* JSCellProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellProtocol.swift; sourceTree = ""; }; 5E737BCD1F596A1D00C0E28D /* JSCellUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCellUtils.swift; sourceTree = ""; }; 5E737BCE1F596A1D00C0E28D /* JSEditCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSEditCell.swift; sourceTree = ""; }; 5E737BCF1F596A1D00C0E28D /* JSEditCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSEditCell.xib; sourceTree = ""; }; 5E737BD01F596A1D00C0E28D /* JSImageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSImageCell.swift; sourceTree = ""; }; 5E737BD11F596A1D00C0E28D /* JSImageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSImageCell.xib; sourceTree = ""; }; 5E737BD21F596A1D00C0E28D /* JSLabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSLabelCell.swift; sourceTree = ""; }; 5E737BD31F596A1D00C0E28D /* JSLabelCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSLabelCell.xib; sourceTree = ""; }; 5E737BD41F596A1D00C0E28D /* JSSelectedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSelectedCell.swift; sourceTree = ""; }; 5E737BD51F596A1D00C0E28D /* JSSelectedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSSelectedCell.xib; sourceTree = ""; }; 5E737BD61F596A1D00C0E28D /* JSSubLabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSubLabelCell.swift; sourceTree = ""; }; 5E737BD71F596A1D00C0E28D /* JSSubLabelCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSSubLabelCell.xib; sourceTree = ""; }; 5E737BD81F596A1D00C0E28D /* JSSwitchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSSwitchCell.swift; sourceTree = ""; }; 5E737BD91F596A1D00C0E28D /* JSSwitchCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSSwitchCell.xib; sourceTree = ""; }; 5E737BDA1F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737BDB1F596A1D00C0E28D /* TableViewCell.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = TableViewCell.xcassets; sourceTree = ""; }; 5E737BDD1F596A1D00C0E28D /* CGRect+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CGRect+Extension.swift"; sourceTree = ""; }; 5E737BDE1F596A1D00C0E28D /* JSApperence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSApperence.swift; sourceTree = ""; }; 5E737BDF1F596A1D00C0E28D /* JSApplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSApplication.swift; sourceTree = ""; }; 5E737BE01F596A1D00C0E28D /* JSCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSCollectionViewCell.swift; sourceTree = ""; }; 5E737BE11F596A1D00C0E28D /* JSDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSDevice.swift; sourceTree = ""; }; 5E737BE21F596A1D00C0E28D /* JSFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSFileManager.swift; sourceTree = ""; }; 5E737BE31F596A1D00C0E28D /* JSNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSNavigationController.swift; sourceTree = ""; }; 5E737BE41F596A1D00C0E28D /* JSTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSTabBarController.swift; sourceTree = ""; }; 5E737BE61F596A1D00C0E28D /* JSUIGlobal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSUIGlobal.swift; sourceTree = ""; }; 5E737BE71F596A1D00C0E28D /* JSUIKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSUIKit.swift; sourceTree = ""; }; 5E737BE81F596A1D00C0E28D /* JSViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSViewController.swift; sourceTree = ""; }; 5E737BE91F596A1D00C0E28D /* NSMutableAttributedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSMutableAttributedString.swift; sourceTree = ""; }; 5E737BEA1F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737BEB1F596A1D00C0E28D /* UIAlertController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIAlertController+Extension.swift"; sourceTree = ""; }; 5E737BEC1F596A1D00C0E28D /* UIColor+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 5E737BED1F596A1D00C0E28D /* UIDevice+Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+Device.swift"; sourceTree = ""; }; 5E737BEE1F596A1D00C0E28D /* UIImage+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 5E737BEF1F596A1D00C0E28D /* UILabel+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UILabel+Extension.swift"; sourceTree = ""; }; 5E737BF01F596A1D00C0E28D /* UILabel+Size.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UILabel+Size.swift"; sourceTree = ""; }; 5E737BF11F596A1D00C0E28D /* UINavigationController+Pop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UINavigationController+Pop.swift"; sourceTree = ""; }; 5E737BF21F596A1D00C0E28D /* UIScreen+Size.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIScreen+Size.swift"; sourceTree = ""; }; 5E737BF31F596A1D00C0E28D /* UIStoryboard+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStoryboard+Extension.swift"; sourceTree = ""; }; 5E737BF41F596A1D00C0E28D /* UITextField+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITextField+Extension.swift"; sourceTree = ""; }; 5E737BF51F596A1D00C0E28D /* UIView+Draw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Draw.swift"; sourceTree = ""; }; 5E737BF61F596A1D00C0E28D /* UIView+Nib.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Nib.swift"; sourceTree = ""; }; 5E737BF71F596A1D00C0E28D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 5E737C8E1F5E143B00C0E28D /* SESearchResultController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchResultController.swift; sourceTree = ""; }; 5E737C901F5E36EB00C0E28D /* JSUtilis.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSUtilis.swift; sourceTree = ""; }; 5E7691FD1CC2323C00E0C2D3 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 5E7691FF1CC2326F00E0C2D3 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 5E7692011CC2327B00E0C2D3 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 5E7692031CC2328B00E0C2D3 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; 5E7692051CC2329100E0C2D3 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; 5E7692071CC2436D00E0C2D3 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; 5E7692091CC2448D00E0C2D3 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 5E76920B1CC2449700E0C2D3 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; }; 5E76920D1CC244A500E0C2D3 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 5E76920F1CC244B500E0C2D3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 5E7692111CC2453300E0C2D3 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; 5E87F6B41E820407001608F1 /* Common.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; 5E87F6B51E820407001608F1 /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 5E87F6B61E820407001608F1 /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 5E8C11791F6140810015B0FE /* SESearchViewController+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SESearchViewController+View.swift"; sourceTree = ""; }; 5E8C117B1F6142990015B0FE /* SESearchOrderButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchOrderButton.swift; sourceTree = ""; }; 5E8C117D1F6144B90015B0FE /* SearchModule.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = SearchModule.xcassets; sourceTree = ""; }; 5E8C117F1F6144FA0015B0FE /* ProfileModule.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = ProfileModule.xcassets; sourceTree = ""; }; 5E8E4F3A209B52430067CF39 /* GetAllTagResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetAllTagResponse.swift; sourceTree = ""; }; 5E8E4F3C209B52610067CF39 /* ObjTag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObjTag.swift; sourceTree = ""; }; 5E8FCF3F22C2075C00817E6F /* BFExploreNavigationModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFExploreNavigationModel.swift; sourceTree = ""; }; 5E8FCF4022C2075C00817E6F /* BFGihubTrendingTimeEnum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGihubTrendingTimeEnum.swift; sourceTree = ""; }; 5E8FCF4122C2075C00817E6F /* BFGithubTrendingUserModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGithubTrendingUserModel.swift; sourceTree = ""; }; 5E8FCF4222C2075C00817E6F /* BFGithubTrendingRequsetModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGithubTrendingRequsetModel.swift; sourceTree = ""; }; 5E8FCF4322C2075C00817E6F /* BFGithubTrengingModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFGithubTrengingModel.swift; sourceTree = ""; }; 5E8FCF4E22C2128800817E6F /* BeeFunTrendingResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeeFunTrendingResponseModel.swift; sourceTree = ""; }; 5E8FCF5022C21B3600817E6F /* NetFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetFilter.swift; sourceTree = ""; }; 5E8FCF5222C22BD000817E6F /* BeeFunResponseModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeeFunResponseModel.swift; sourceTree = ""; }; 5E8FCF5422C246B500817E6F /* BeeFun.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BeeFun.entitlements; sourceTree = ""; }; 5E95E75B1E8F2D2C006C80BE /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 5E98162420D8B837002DD1EE /* IdentityAndTrust.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentityAndTrust.swift; sourceTree = ""; }; 5EA054EA208CD6BA009922AE /* BeeFunAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeeFunAPI.swift; sourceTree = ""; }; 5EA1B64F1F8CFF5D00DFAB7F /* JSMBHUDBridge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSMBHUDBridge.swift; sourceTree = ""; }; 5EA3BF3920A9CCCE00D3CC79 /* BeeFunDBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeeFunDBManager.swift; sourceTree = ""; }; 5EA61E751F7E2DDC00AD8ACC /* BFEventParase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventParase.swift; sourceTree = ""; }; 5EA61E781F7E327200AD8ACC /* BFEventCommitView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventCommitView.swift; sourceTree = ""; }; 5EA61E791F7E327200AD8ACC /* BFEventPRDetailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventPRDetailView.swift; sourceTree = ""; }; 5EA61E7A1F7E327200AD8ACC /* BFEventTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventTextView.swift; sourceTree = ""; }; 5EA61E7B1F7E327200AD8ACC /* BFEventTimeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventTimeView.swift; sourceTree = ""; }; 5EA61E7C1F7E327200AD8ACC /* BFEventTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventTitleView.swift; sourceTree = ""; }; 5EA61E7D1F7E327200AD8ACC /* BFEventView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventView.swift; sourceTree = ""; }; 5EA61E7E1F7E327200AD8ACC /* BFImageViewAttachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFImageViewAttachment.swift; sourceTree = ""; }; 5EAC2F0A20201953000442FE /* BFZipManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFZipManager.swift; sourceTree = ""; }; 5EAC2F0C202019CD000442FE /* BFPathManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFPathManager.swift; sourceTree = ""; }; 5EAC2F0E20201A2C000442FE /* SQLConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLConnection.swift; sourceTree = ""; }; 5EAC2F1020205462000442FE /* BFMonitor+Handle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BFMonitor+Handle.swift"; sourceTree = ""; }; 5EAC2F1120205462000442FE /* BFMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFMonitor.swift; sourceTree = ""; }; 5EAC2F142020679E000442FE /* BFUserDefaultManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFUserDefaultManager.swift; sourceTree = ""; }; 5EAC2F1F2022FC3E000442FE /* SQLStar+Update.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SQLStar+Update.swift"; sourceTree = ""; }; 5EAC2F202022FC3E000442FE /* SQLStars+Base.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SQLStars+Base.swift"; sourceTree = ""; }; 5EAC2F212022FC3E000442FE /* SQLStar+Delete.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SQLStar+Delete.swift"; sourceTree = ""; }; 5EAC2F222022FC3F000442FE /* SQLStars+Find.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SQLStars+Find.swift"; sourceTree = ""; }; 5EAC2F232022FC3F000442FE /* SQLTags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLTags.swift; sourceTree = ""; }; 5EAC2F242022FC3F000442FE /* SQLStars.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLStars.swift; sourceTree = ""; }; 5EAEF74920EC5C6900DB76BC /* BFFeedbackController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFFeedbackController.swift; sourceTree = ""; }; 5EAF8D55209E01CE004D256B /* BFStatusCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFStatusCode.swift; sourceTree = ""; }; 5EAF8D8A20A6A651004D256B /* GetReposResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetReposResponse.swift; sourceTree = ""; }; 5EAF8D9020A6D2D2004D256B /* ObjRepos.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjRepos.swift; sourceTree = ""; }; 5EB357111F76095600734A01 /* BFEventCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventCell.swift; sourceTree = ""; }; 5EB357131F76096200734A01 /* BFEventLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventLayout.swift; sourceTree = ""; }; 5EB357151F760A0C00734A01 /* BFEventBaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventBaseCell.swift; sourceTree = ""; }; 5EB357271F76B90700734A01 /* BFEventConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFEventConstants.swift; sourceTree = ""; }; 5EB357291F773DBB00734A01 /* DispatchQueue+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchQueue+Extension.swift"; sourceTree = ""; }; 5EB55D091F61483600D6CB25 /* SESearchResultController+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SESearchResultController+View.swift"; sourceTree = ""; }; 5EB55D0E1F6187A700D6CB25 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFPopularLanguage.plist; sourceTree = ""; }; 5EB55D101F6187A900D6CB25 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFPopularLanguage.plist"; sourceTree = ""; }; 5EB824551F63727E006EB085 /* BFPlistResourcesKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFPlistResourcesKey.swift; sourceTree = ""; }; 5EB824591F637F54006EB085 /* SearchAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchAPI.swift; sourceTree = ""; }; 5EB8245B1F638C8D006EB085 /* SESearchRepoModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchRepoModel.swift; sourceTree = ""; }; 5EB8245D1F638C9B006EB085 /* SESearchUserModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchUserModel.swift; sourceTree = ""; }; 5EB8245F1F638CAA006EB085 /* SESearchWikiModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchWikiModel.swift; sourceTree = ""; }; 5EB824611F638CB6006EB085 /* SESearchCodeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchCodeModel.swift; sourceTree = ""; }; 5EB824631F638CCB006EB085 /* SESearchIssueModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchIssueModel.swift; sourceTree = ""; }; 5EB824651F638CEC006EB085 /* SESearchCommitModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchCommitModel.swift; sourceTree = ""; }; 5EBA24D7201D82C000F097ED /* OAuthGithubWebController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OAuthGithubWebController.swift; sourceTree = ""; }; 5EBA24D8201D82C100F097ED /* OAuthManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OAuthManager.swift; sourceTree = ""; }; 5EBAAE1E1F90AC29007BBAA8 /* BFTrendingSearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFTrendingSearchBar.swift; sourceTree = ""; }; 5EBAAE201F90B9CA007BBAA8 /* JSSearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSSearchBar.swift; sourceTree = ""; }; 5EBEC3F120D943CC00ABDD4D /* BFReposSyncController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BFReposSyncController.swift; sourceTree = ""; }; 5EBEC3F620D9446F00ABDD4D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFRepoSync.plist; sourceTree = ""; }; 5EBEC3F820D9447100ABDD4D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFRepoSync.plist"; sourceTree = ""; }; 5EBEC3F920D95BCB00ABDD4D /* BFLanunchManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFLanunchManager.swift; sourceTree = ""; }; 5EC1499D1E828F90002039C2 /* Adhoc.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Adhoc.xcconfig; sourceTree = ""; }; 5EC1F33620C2339E00792C93 /* BFBaseViewController+Empty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Empty.swift"; sourceTree = ""; }; 5EC1F33820C23B3700792C93 /* BFPlaceHolderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFPlaceHolderView.swift; sourceTree = ""; }; 5ECAE4FB201EB9A100DB6AD5 /* ObjGithubStarRepos.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjGithubStarRepos.swift; sourceTree = ""; }; 5ECAE4FC201EB9A100DB6AD5 /* ObjReposSum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjReposSum.swift; sourceTree = ""; }; 5ECDD2181FD6725200A7E4F7 /* BFDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFDocument.swift; sourceTree = ""; }; 5EDCB1221F14EA0200DC844D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BFLanguage.plist; sourceTree = ""; }; 5EDCB1241F14EA0300DC844D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BFLanguage.plist"; sourceTree = ""; }; 5EE011791F6CA58100F3AF3B /* YYTextManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YYTextManager.swift; sourceTree = ""; }; 5EE6438720D8F4B300F47E43 /* BFMessageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFMessageManager.swift; sourceTree = ""; }; 5EF3C04C1E9007C700BDB8B0 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; 5EF837D31F66DF28009D4C09 /* ObjSearchCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjSearchCode.swift; sourceTree = ""; }; 5EF837D51F66E10E009D4C09 /* SESearchCodeCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SESearchCodeCell.swift; sourceTree = ""; }; 5EFC7B011F90A504006D5139 /* InsetNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsetNavigationBar.swift; sourceTree = ""; }; 5EFDFA5820C25D5200998B84 /* BFEmptyDataCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BFEmptyDataCell.swift; sourceTree = ""; }; 5EFDFA5A20C2E48300998B84 /* BFBaseViewController+Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Login.swift"; sourceTree = ""; }; 5EFDFA5C20C2F1ED00998B84 /* BFBaseViewController+Noti.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BFBaseViewController+Noti.swift"; sourceTree = ""; }; 5EFE2C711F6B3E140040FC3C /* ObjPullRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjPullRequest.swift; sourceTree = ""; }; 5EFE2C751F6B42A40040FC3C /* ObjBranch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjBranch.swift; sourceTree = ""; }; 5EFE2C771F6B44750040FC3C /* ObjLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjLinks.swift; sourceTree = ""; }; 5EFE2C791F6B45520040FC3C /* ObjHref.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjHref.swift; sourceTree = ""; }; 69DA18879BDE528600046027 /* Pods-Coderpursue.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Coderpursue.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Coderpursue/Pods-Coderpursue.debug.xcconfig"; sourceTree = ""; }; 7C4A8DBCF2271C938FDD0F1B /* Pods-Coderpursue.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Coderpursue.release.xcconfig"; path = "Pods/Target Support Files/Pods-Coderpursue/Pods-Coderpursue.release.xcconfig"; sourceTree = ""; }; 8B5E816C288376FF8745B070 /* Pods_BeeFun.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BeeFun.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8B89AFF6A75319EC156E476E /* Pods-BeeFun.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeFun.release.xcconfig"; path = "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.release.xcconfig"; sourceTree = ""; }; A45747E9B436E16CD67E3161 /* Pods-BeeFun.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeFun.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.debug.xcconfig"; sourceTree = ""; }; FE26BCBC1C4231FB00887534 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = "Pods/../build/Debug-iphoneos/Alamofire.framework"; sourceTree = ""; }; FE26BCC51C44754C00887534 /* ObjectMapper.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ObjectMapper.framework; path = "Pods/../build/Debug-iphoneos/ObjectMapper.framework"; sourceTree = ""; }; FE37DEF61C4A8F1F00B8449D /* Kingfisher.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kingfisher.framework; path = "../../../Library/Developer/Xcode/DerivedData/Coderpursue-fyrcacrvclpljuegolrtoeolcnta/Build/Products/Debug-iphoneos/Kingfisher.framework"; sourceTree = ""; }; FEC0DC361C28B39F0008C7C1 /* BeeFun.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BeeFun.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ FEC0DC331C28B39F0008C7C1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 5E95E75C1E8F2D2C006C80BE /* MobileCoreServices.framework in Frameworks */, 5E7368701E77D50F00AEBA77 /* libresolv.tbd in Frameworks */, 5E73686E1E77D4FE00AEBA77 /* UserNotifications.framework in Frameworks */, 5E0943951CC1F0100047118D /* libz.tbd in Frameworks */, 5E7691FE1CC2323C00E0C2D3 /* Security.framework in Frameworks */, 5E2816C91FCCFE9D007A5159 /* SinaWeiboConnector.framework in Frameworks */, 5E2816C21FCCFE9D007A5159 /* ShareSDKConfigFile.framework in Frameworks */, 5E2816CB1FCCFE9D007A5159 /* WechatConnector.framework in Frameworks */, 5E2816C71FCCFE9D007A5159 /* MailConnector.framework in Frameworks */, 5E7692021CC2327B00E0C2D3 /* CoreGraphics.framework in Frameworks */, 5E7692041CC2328B00E0C2D3 /* CoreTelephony.framework in Frameworks */, 5E73686C1E77D4CC00AEBA77 /* CFNetwork.framework in Frameworks */, 5E2816C31FCCFE9D007A5159 /* ShareSDKExtension.framework in Frameworks */, 5EF3C04D1E9007C700BDB8B0 /* StoreKit.framework in Frameworks */, 5E2816D01FCCFE9D007A5159 /* libWeChatSDK.a in Frameworks */, 5E2816C01FCCFE9D007A5159 /* ShareSDK.framework in Frameworks */, 5E0943991CC1F0220047118D /* JavaScriptCore.framework in Frameworks */, 5E09439F1CC1F03C0047118D /* MessageUI.framework in Frameworks */, 5E2816D41FCCFE9D007A5159 /* UMMobClick.framework in Frameworks */, 5E76920A1CC2448D00E0C2D3 /* CoreData.framework in Frameworks */, 5E2816BF1FCCFE9D007A5159 /* MOBFoundation.framework in Frameworks */, 5E2816CA1FCCFE9D007A5159 /* TwitterConnector.framework in Frameworks */, 5E09439B1CC1F02B0047118D /* ImageIO.framework in Frameworks */, 5E0DDC731E72D4DB00493ABA /* libc++.tbd in Frameworks */, 5E2816CE1FCCFE9D007A5159 /* libWeiboSDK.a in Frameworks */, 5E7692001CC2326F00E0C2D3 /* SystemConfiguration.framework in Frameworks */, 5E09439D1CC1F0320047118D /* libsqlite3.tbd in Frameworks */, 5E7692121CC2453300E0C2D3 /* Social.framework in Frameworks */, 5E2816CC1FCCFE9D007A5159 /* TencentOpenAPI.framework in Frameworks */, 5E7692101CC244B500E0C2D3 /* QuartzCore.framework in Frameworks */, 5E2816C51FCCFE9D007A5159 /* ShareSDKUI.framework in Frameworks */, 5E76920E1CC244A500E0C2D3 /* OpenGLES.framework in Frameworks */, 5E76920C1CC2449700E0C2D3 /* Accounts.framework in Frameworks */, 5E2816C81FCCFE9D007A5159 /* QQConnector.framework in Frameworks */, 5E7692081CC2436D00E0C2D3 /* AdSupport.framework in Frameworks */, 5E7692061CC2329100E0C2D3 /* libiconv.tbd in Frameworks */, 5E0943971CC1F01C0047118D /* libstdc++.tbd in Frameworks */, 5E0943931CC1F0020047118D /* libicucore.tbd in Frameworks */, 5E2816D31FCCFE9D007A5159 /* ShareSDKConnector.framework in Frameworks */, FE37DEF71C4A8F1F00B8449D /* Kingfisher.framework in Frameworks */, 5E2816C61FCCFE9D007A5159 /* FacebookConnector.framework in Frameworks */, FE26BCC61C44754C00887534 /* ObjectMapper.framework in Frameworks */, FE26BCBD1C4231FB00887534 /* Alamofire.framework in Frameworks */, B1AD3185D8591195BE15CE1F /* Pods_BeeFun.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 4D8F6ECC1AEDFB027177FDBB /* Frameworks */ = { isa = PBXGroup; children = ( 5EF3C04C1E9007C700BDB8B0 /* StoreKit.framework */, 5E95E75B1E8F2D2C006C80BE /* MobileCoreServices.framework */, 5E73686F1E77D50F00AEBA77 /* libresolv.tbd */, 5E73686D1E77D4FE00AEBA77 /* UserNotifications.framework */, 5E73686B1E77D4CC00AEBA77 /* CFNetwork.framework */, 5E0DDC721E72D4DB00493ABA /* libc++.tbd */, 5E7692111CC2453300E0C2D3 /* Social.framework */, 5E76920F1CC244B500E0C2D3 /* QuartzCore.framework */, 5E76920D1CC244A500E0C2D3 /* OpenGLES.framework */, 5E76920B1CC2449700E0C2D3 /* Accounts.framework */, 5E7692091CC2448D00E0C2D3 /* CoreData.framework */, 5E7692071CC2436D00E0C2D3 /* AdSupport.framework */, 5E7692051CC2329100E0C2D3 /* libiconv.tbd */, 5E7692031CC2328B00E0C2D3 /* CoreTelephony.framework */, 5E7692011CC2327B00E0C2D3 /* CoreGraphics.framework */, 5E7691FF1CC2326F00E0C2D3 /* SystemConfiguration.framework */, 5E7691FD1CC2323C00E0C2D3 /* Security.framework */, 5E09439E1CC1F03C0047118D /* MessageUI.framework */, 5E09439C1CC1F0320047118D /* libsqlite3.tbd */, 5E09439A1CC1F02B0047118D /* ImageIO.framework */, 5E0943981CC1F0220047118D /* JavaScriptCore.framework */, 5E0943961CC1F01C0047118D /* libstdc++.tbd */, 5E0943941CC1F0100047118D /* libz.tbd */, 5E0943921CC1F0020047118D /* libicucore.tbd */, FE37DEF61C4A8F1F00B8449D /* Kingfisher.framework */, FE26BCC51C44754C00887534 /* ObjectMapper.framework */, FE26BCBC1C4231FB00887534 /* Alamofire.framework */, 1E8CC865E56BA5C5F2757091 /* Pods.framework */, 29E3608C6B9F8CEB6E8B525C /* Pods_Coderpursue.framework */, 8B5E816C288376FF8745B070 /* Pods_BeeFun.framework */, ); name = Frameworks; sourceTree = ""; }; 5E03B08820C03D8C00D3561E /* BaseViewController */ = { isa = PBXGroup; children = ( 5E0447F11F653177001DD0B7 /* BFBaseViewController.swift */, 5E0447ED1F653177001DD0B7 /* BFBaseViewController+Answer.swift */, 5E0447EE1F653177001DD0B7 /* BFBaseViewController+Nav.swift */, 5E0447EF1F653177001DD0B7 /* BFBaseViewController+Refresh.swift */, 5E0447F01F653177001DD0B7 /* BFBaseViewController+TableView.swift */, 5E03B08620C03D5200D3561E /* BFBaseViewController+Reload.swift */, 5EC1F33620C2339E00792C93 /* BFBaseViewController+Empty.swift */, 5EFDFA5A20C2E48300998B84 /* BFBaseViewController+Login.swift */, 5EFDFA5C20C2F1ED00998B84 /* BFBaseViewController+Noti.swift */, ); path = BaseViewController; sourceTree = ""; }; 5E0447DD1F64E3F4001DD0B7 /* ResultResponse */ = { isa = PBXGroup; children = ( 5E0447DE1F64E456001DD0B7 /* SEResponseRepos.swift */, 5E0447DF1F64E456001DD0B7 /* SEResponseUsers.swift */, 5E0447E21F64FB09001DD0B7 /* SEResponseIssues.swift */, 5E0447E41F64FB17001DD0B7 /* SEResponseCode.swift */, 5E0447E61F64FB22001DD0B7 /* SEResponseCommits.swift */, 5E0447E81F64FB2C001DD0B7 /* SEResponseWikis.swift */, ); path = ResultResponse; sourceTree = ""; }; 5E0447EB1F653177001DD0B7 /* Controller */ = { isa = PBXGroup; children = ( 5E0447EC1F653177001DD0B7 /* BFBaseTabBarController.swift */, 5E0447F21F653177001DD0B7 /* BFWebViewController.swift */, ); path = Controller; sourceTree = ""; }; 5E0447FA1F6531B0001DD0B7 /* User */ = { isa = PBXGroup; children = ( 5E0448961F65ADD4001DD0B7 /* UserCell */, 5E04489D1F65ADD4001DD0B7 /* View */, 5E0447FB1F6531B0001DD0B7 /* BFUserDetailController.swift */, 5E0447FC1F6531B0001DD0B7 /* BFUserListController.swift */, ); path = User; sourceTree = ""; }; 5E0448961F65ADD4001DD0B7 /* UserCell */ = { isa = PBXGroup; children = ( 5E0448971F65ADD4001DD0B7 /* BFUserTypeOneCell.swift */, 5E0448981F65ADD4001DD0B7 /* BFUserTypeOneCell.xib */, 5E0448991F65ADD4001DD0B7 /* BFUserTypeSecCell.swift */, 5E04489A1F65ADD4001DD0B7 /* BFUserTypeSecCell.xib */, 5E04489B1F65ADD4001DD0B7 /* BFUserTypeThirdCell.swift */, 5E04489C1F65ADD4001DD0B7 /* BFUserTypeThirdCell.xib */, ); path = UserCell; sourceTree = ""; }; 5E04489D1F65ADD4001DD0B7 /* View */ = { isa = PBXGroup; children = ( 5E04489E1F65ADD4001DD0B7 /* CPDeveloperInfoView.swift */, ); path = View; sourceTree = ""; }; 5E0448A61F65ADE4001DD0B7 /* RepositoryCell */ = { isa = PBXGroup; children = ( 5E0448A71F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.swift */, 5E0448A81F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.xib */, 5E0448A91F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.swift */, 5E0448AA1F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.xib */, 5E0448AB1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.swift */, 5E0448AC1F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.xib */, 5E0448AD1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.swift */, 5E0448AE1F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.xib */, ); path = RepositoryCell; sourceTree = ""; }; 5E0448AF1F65ADE4001DD0B7 /* View */ = { isa = PBXGroup; children = ( 5E0448B01F65ADE4001DD0B7 /* CPReposInfoView.swift */, 5E0448B11F65ADE4001DD0B7 /* CPReposPosterView.swift */, ); path = View; sourceTree = ""; }; 5E0448BC1F65AE12001DD0B7 /* Event */ = { isa = PBXGroup; children = ( 5E6AE53E1F91742A00813B6C /* Event.xcassets */, 5EA61E771F7E327200AD8ACC /* NotUse */, 5E0448BD1F65AE12001DD0B7 /* EventCell */, ); path = Event; sourceTree = ""; }; 5E0448BD1F65AE12001DD0B7 /* EventCell */ = { isa = PBXGroup; children = ( 5EB357271F76B90700734A01 /* BFEventConstants.swift */, 5EB357151F760A0C00734A01 /* BFEventBaseCell.swift */, 5EB357131F76096200734A01 /* BFEventLayout.swift */, 5EA61E751F7E2DDC00AD8ACC /* BFEventParase.swift */, 5EB357111F76095600734A01 /* BFEventCell.swift */, ); path = EventCell; sourceTree = ""; }; 5E048A6E2131598A0098CBF6 /* NewTrending */ = { isa = PBXGroup; children = ( 5E048A6F213159A20098CBF6 /* BFNewTrendingController.swift */, ); path = NewTrending; sourceTree = ""; }; 5E0FE4421E8FFFDA00356232 /* BeeFun */ = { isa = PBXGroup; children = ( 5E8FCF5422C246B500817E6F /* BeeFun.entitlements */, 5E2816951FCCFE9D007A5159 /* ThirdParty */, 5E737BA01F596A1D00C0E28D /* ToolKit */, 5E0FE48F1E8FFFDA00356232 /* Model */, 5E0FE4C51E8FFFDA00356232 /* Resources */, 5E737B4D1F596A1300C0E28D /* SystemManager */, 5E737A7B1F59696E00C0E28D /* View */, 5EF3C04E1E900FB900BDB8B0 /* Support Files */, 5E0FE4431E8FFFDA00356232 /* AppDelegate.swift */, 5E0FE4501E8FFFDA00356232 /* Info.plist */, 5E0FE4441E8FFFDA00356232 /* Assets.xcassets */, ); path = BeeFun; sourceTree = ""; }; 5E0FE48F1E8FFFDA00356232 /* Model */ = { isa = PBXGroup; children = ( 5E8E4F37209B51840067CF39 /* BeeFunModel */, 5E0FE4901E8FFFDA00356232 /* DataModel.swift */, 5E0FE4A31E8FFFDA00356232 /* ObjBase.swift */, 5E0FE4911E8FFFDA00356232 /* Event */, 5E0FE4981E8FFFDA00356232 /* Issue */, 5E0FE49D1E8FFFDA00356232 /* Network */, 5E0FE4A41E8FFFDA00356232 /* Other */, 5E0FE4AC1E8FFFDA00356232 /* Repos */, 5E0FE4AF1E8FFFDA00356232 /* Trending */, 5E0FE4B31E8FFFDA00356232 /* User */, ); path = Model; sourceTree = ""; }; 5E0FE4911E8FFFDA00356232 /* Event */ = { isa = PBXGroup; children = ( 5E0FE4921E8FFFDA00356232 /* ObjComment.swift */, 5E0FE4931E8FFFDA00356232 /* ObjCommit.swift */, 5E0FE4941E8FFFDA00356232 /* ObjEvent.swift */, 5E0FE4951E8FFFDA00356232 /* ObjEventPayload.swift */, 5E0FE4961E8FFFDA00356232 /* ObjNotification.swift */, 5E0FE4971E8FFFDA00356232 /* ObjSubject.swift */, 5EF837D31F66DF28009D4C09 /* ObjSearchCode.swift */, 5EFE2C711F6B3E140040FC3C /* ObjPullRequest.swift */, 5EFE2C751F6B42A40040FC3C /* ObjBranch.swift */, 5EFE2C771F6B44750040FC3C /* ObjLinks.swift */, 5EFE2C791F6B45520040FC3C /* ObjHref.swift */, 5E47F69D1F79F15100D24180 /* ObjRelease.swift */, 5E47F69F1F7A07AC00D24180 /* ObjAsset.swift */, 5E47F6A11F7A28F700D24180 /* ObjDeployment.swift */, 5E47F6A31F7A29D000D24180 /* ObjDeploymentPayload.swift */, 5E1A28851F7A4CB300A60EE0 /* ObjMember.swift */, 5E6AE5401F9178A500813B6C /* ObjPage.swift */, ); path = Event; sourceTree = ""; }; 5E0FE4981E8FFFDA00356232 /* Issue */ = { isa = PBXGroup; children = ( 5E0FE4991E8FFFDA00356232 /* ObjIssue.swift */, 5E0FE49A1E8FFFDA00356232 /* ObjLabel.swift */, 5E0FE49B1E8FFFDA00356232 /* ObjMilestone.swift */, ); path = Issue; sourceTree = ""; }; 5E0FE49D1E8FFFDA00356232 /* Network */ = { isa = PBXGroup; children = ( 5E0FE49E1E8FFFDA00356232 /* AppToken.swift */, 5E0FE49F1E8FFFDA00356232 /* ObjErropReponse.swift */, 5E0FE4A01E8FFFDA00356232 /* ObjError.swift */, 5E0FE4A11E8FFFDA00356232 /* ObjResponseHeader.swift */, 5E0FE4A21E8FFFDA00356232 /* ObjResponser.swift */, 5E8FCF5022C21B3600817E6F /* NetFilter.swift */, ); path = Network; sourceTree = ""; }; 5E0FE4A41E8FFFDA00356232 /* Other */ = { isa = PBXGroup; children = ( 5E0FE4A51E8FFFDA00356232 /* ObjSettings.swift */, ); path = Other; sourceTree = ""; }; 5E0FE4AC1E8FFFDA00356232 /* Repos */ = { isa = PBXGroup; children = ( 5ECAE4FC201EB9A100DB6AD5 /* ObjReposSum.swift */, 5EAF8D9020A6D2D2004D256B /* ObjRepos.swift */, 5ECAE4FB201EB9A100DB6AD5 /* ObjGithubStarRepos.swift */, ); path = Repos; sourceTree = ""; }; 5E0FE4AF1E8FFFDA00356232 /* Trending */ = { isa = PBXGroup; children = ( 5E0FE4B21E8FFFDA00356232 /* ObjShowcase.swift */, ); path = Trending; sourceTree = ""; }; 5E0FE4B31E8FFFDA00356232 /* User */ = { isa = PBXGroup; children = ( 5E0FE4B41E8FFFDA00356232 /* ObjEmail.swift */, 5E0FE4B51E8FFFDA00356232 /* ObjPermissions.swift */, 5E0FE4B61E8FFFDA00356232 /* ObjPlan.swift */, 5E0FE4B71E8FFFDA00356232 /* ObjUser.swift */, 5E0FE4B81E8FFFDA00356232 /* ObjUserSum.swift */, ); path = User; sourceTree = ""; }; 5E0FE4C51E8FFFDA00356232 /* Resources */ = { isa = PBXGroup; children = ( 5E66325E20D8BECC008F922D /* cert */, 5E0FE4C61E8FFFDA00356232 /* Image */, 5E0FE4FE1E8FFFDA00356232 /* Localizable */, 5E0FE5021E8FFFDA00356232 /* plist */, ); path = Resources; sourceTree = ""; }; 5E0FE4C61E8FFFDA00356232 /* Image */ = { isa = PBXGroup; children = ( 5E0FE4C71E8FFFDA00356232 /* tab_gist@2x.png */, 5E0FE4C91E8FFFDA00356232 /* tab_gist_sel@2x.png */, 5E0FE4CB1E8FFFDA00356232 /* tabbar */, ); path = Image; sourceTree = ""; }; 5E0FE4CB1E8FFFDA00356232 /* tabbar */ = { isa = PBXGroup; children = ( 5E0FE4CC1E8FFFDA00356232 /* tab_hot@2x.png */, 5E0FE4CE1E8FFFDA00356232 /* tab_hot@3x.png */, 5E0FE4D01E8FFFDA00356232 /* tab_hot_sel@2x.png */, 5E0FE4D21E8FFFDA00356232 /* tab_hot_sel@3x.png */, 5E0FE4D41E8FFFDA00356232 /* tab_me@2x.png */, 5E0FE4D61E8FFFDA00356232 /* tab_me@3x.png */, 5E0FE4D81E8FFFDA00356232 /* tab_me_sel@2x.png */, 5E0FE4DA1E8FFFDA00356232 /* tab_me_sel@3x.png */, 5E0FE4DC1E8FFFDA00356232 /* tab_mes@2x.png */, 5E0FE4DE1E8FFFDA00356232 /* tab_mes@3x.png */, 5E0FE4E01E8FFFDA00356232 /* tab_mes_sel@2x.png */, 5E0FE4E21E8FFFDA00356232 /* tab_mes_sel@3x.png */, 5E0FE4E41E8FFFDA00356232 /* tab_star@2x.png */, 5E0FE4E61E8FFFDA00356232 /* tab_star@3x.png */, 5E0FE4E81E8FFFDA00356232 /* tab_star_sel@2x.png */, 5E0FE4EA1E8FFFDA00356232 /* tab_star_sel@3x.png */, ); path = tabbar; sourceTree = ""; }; 5E0FE4FE1E8FFFDA00356232 /* Localizable */ = { isa = PBXGroup; children = ( 5E0FE4FF1E8FFFDA00356232 /* Localizable.strings */, ); path = Localizable; sourceTree = ""; }; 5E0FE5021E8FFFDA00356232 /* plist */ = { isa = PBXGroup; children = ( 5EDCB1231F14EA0200DC844D /* BFLanguage.plist */, 5E0FE5071E8FFFDA00356232 /* CPCity.plist */, 5E0FE5091E8FFFDA00356232 /* CPCountry.plist */, 5E0FE50B1E8FFFDA00356232 /* CPFilterLanguage.plist */, 5E0FE50F1E8FFFDA00356232 /* BFSetting.plist */, 5EB55D0F1F6187A700D6CB25 /* BFPopularLanguage.plist */, ); path = plist; sourceTree = ""; }; 5E2816951FCCFE9D007A5159 /* ThirdParty */ = { isa = PBXGroup; children = ( 5E2816971FCCFE9D007A5159 /* MobSDK */, 5E2816BE1FCCFE9D007A5159 /* UMMobClick.framework */, ); path = ThirdParty; sourceTree = ""; }; 5E2816971FCCFE9D007A5159 /* MobSDK */ = { isa = PBXGroup; children = ( 5E2816981FCCFE9D007A5159 /* Required */, 5E28169A1FCCFE9D007A5159 /* ShareSDK */, ); path = MobSDK; sourceTree = ""; }; 5E2816981FCCFE9D007A5159 /* Required */ = { isa = PBXGroup; children = ( 5E2816991FCCFE9D007A5159 /* MOBFoundation.framework */, ); path = Required; sourceTree = ""; }; 5E28169A1FCCFE9D007A5159 /* ShareSDK */ = { isa = PBXGroup; children = ( 5E28169B1FCCFE9D007A5159 /* ShareSDK.framework */, 5E28169C1FCCFE9D007A5159 /* Support */, ); path = ShareSDK; sourceTree = ""; }; 5E28169C1FCCFE9D007A5159 /* Support */ = { isa = PBXGroup; children = ( 5E28169D1FCCFE9D007A5159 /* Optional */, 5E2816A31FCCFE9D007A5159 /* PlatformConnector */, 5E2816AA1FCCFE9D007A5159 /* PlatformSDK */, 5E2816BB1FCCFE9D007A5159 /* Required */, ); path = Support; sourceTree = ""; }; 5E28169D1FCCFE9D007A5159 /* Optional */ = { isa = PBXGroup; children = ( 5E28169E1FCCFE9D007A5159 /* ShareSDKConfigFile.bundle */, 5E28169F1FCCFE9D007A5159 /* ShareSDKConfigFile.framework */, 5E2816A01FCCFE9D007A5159 /* ShareSDKExtension.framework */, 5E2816A11FCCFE9D007A5159 /* ShareSDKUI.bundle */, 5E2816A21FCCFE9D007A5159 /* ShareSDKUI.framework */, ); path = Optional; sourceTree = ""; }; 5E2816A31FCCFE9D007A5159 /* PlatformConnector */ = { isa = PBXGroup; children = ( 5E2816A41FCCFE9D007A5159 /* FacebookConnector.framework */, 5E2816A51FCCFE9D007A5159 /* MailConnector.framework */, 5E2816A61FCCFE9D007A5159 /* QQConnector.framework */, 5E2816A71FCCFE9D007A5159 /* SinaWeiboConnector.framework */, 5E2816A81FCCFE9D007A5159 /* TwitterConnector.framework */, 5E2816A91FCCFE9D007A5159 /* WechatConnector.framework */, ); path = PlatformConnector; sourceTree = ""; }; 5E2816AA1FCCFE9D007A5159 /* PlatformSDK */ = { isa = PBXGroup; children = ( 5E2816AB1FCCFE9D007A5159 /* QQSDK */, 5E2816AE1FCCFE9D007A5159 /* SinaWeiboSDK */, 5E2816B51FCCFE9D007A5159 /* WeChatSDK */, ); path = PlatformSDK; sourceTree = ""; }; 5E2816AB1FCCFE9D007A5159 /* QQSDK */ = { isa = PBXGroup; children = ( 5E2816AC1FCCFE9D007A5159 /* TencentOpenAPI.framework */, 5E2816AD1FCCFE9D007A5159 /* TencentOpenApi_IOS_Bundle.bundle */, ); path = QQSDK; sourceTree = ""; }; 5E2816AE1FCCFE9D007A5159 /* SinaWeiboSDK */ = { isa = PBXGroup; children = ( 5E2816AF1FCCFE9D007A5159 /* libWeiboSDK.a */, 5E2816B01FCCFE9D007A5159 /* WBHttpRequest+WeiboToken.h */, 5E2816B11FCCFE9D007A5159 /* WBHttpRequest.h */, 5E2816B21FCCFE9D007A5159 /* WeiboSDK+Statistics.h */, 5E2816B31FCCFE9D007A5159 /* WeiboSDK.bundle */, 5E2816B41FCCFE9D007A5159 /* WeiboSDK.h */, ); path = SinaWeiboSDK; sourceTree = ""; }; 5E2816B51FCCFE9D007A5159 /* WeChatSDK */ = { isa = PBXGroup; children = ( 5E2816B61FCCFE9D007A5159 /* libWeChatSDK.a */, 5E2816B71FCCFE9D007A5159 /* README.txt */, 5E2816B81FCCFE9D007A5159 /* WechatAuthSDK.h */, 5E2816B91FCCFE9D007A5159 /* WXApi.h */, 5E2816BA1FCCFE9D007A5159 /* WXApiObject.h */, ); path = WeChatSDK; sourceTree = ""; }; 5E2816BB1FCCFE9D007A5159 /* Required */ = { isa = PBXGroup; children = ( 5E2816BC1FCCFE9D007A5159 /* ShareSDK.bundle */, 5E2816BD1FCCFE9D007A5159 /* ShareSDKConnector.framework */, ); path = Required; sourceTree = ""; }; 5E66325E20D8BECC008F922D /* cert */ = { isa = PBXGroup; children = ( 5E66325F20D8BED5008F922D /* beefuntop.p12 */, ); path = cert; sourceTree = ""; }; 5E66326120D8E8D7008F922D /* Push */ = { isa = PBXGroup; children = ( 5E260E8F20CB9EC70075B8C3 /* JPushManager.swift */, 5EE6438720D8F4B300F47E43 /* BFMessageManager.swift */, ); path = Push; sourceTree = ""; }; 5E6C24B120EFC1BE00373ED9 /* Feedback */ = { isa = PBXGroup; children = ( 5EAEF74920EC5C6900DB76BC /* BFFeedbackController.swift */, 5E6C24AD20EFBA1D00373ED9 /* BFFeedbackIssueController.swift */, ); path = Feedback; sourceTree = ""; }; 5E737A7B1F59696E00C0E28D /* View */ = { isa = PBXGroup; children = ( 5E048A6E2131598A0098CBF6 /* NewTrending */, 5E03B08820C03D8C00D3561E /* BaseViewController */, 5E737A7C1F59696E00C0E28D /* Base */, 5E737A871F59696E00C0E28D /* Common */, 5E0447FA1F6531B0001DD0B7 /* User */, 5E737A9A1F59696E00C0E28D /* Gist */, 5E0448BC1F65AE12001DD0B7 /* Event */, 5E737A9C1F59696E00C0E28D /* Issue */, 5E737AA01F59696E00C0E28D /* Message */, 5E737AA41F59696E00C0E28D /* Notification */, 5E737AA81F59696E00C0E28D /* Profile */, 5E737ABF1F59696E00C0E28D /* Repository */, 5E737AC81F59696E00C0E28D /* Search */, 5E737ACD1F59696E00C0E28D /* Settings */, 5E737ACE1F59696E00C0E28D /* Stars */, 5E737AD81F59696E00C0E28D /* Tag */, 5E737AE41F59696E00C0E28D /* Trending */, ); path = View; sourceTree = ""; }; 5E737A7C1F59696E00C0E28D /* Base */ = { isa = PBXGroup; children = ( 5E0447EB1F653177001DD0B7 /* Controller */, 5E737A841F59696E00C0E28D /* ViewCell */, ); path = Base; sourceTree = ""; }; 5E737A841F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737A851F59696E00C0E28D /* BFBaseCell.swift */, 5E737A861F59696E00C0E28D /* BFSwipeCell.swift */, ); path = ViewCell; sourceTree = ""; }; 5E737A871F59696E00C0E28D /* Common */ = { isa = PBXGroup; children = ( 5EC1F33820C23B3700792C93 /* BFPlaceHolderView.swift */, 5EFDFA5820C25D5200998B84 /* BFEmptyDataCell.swift */, ); path = Common; sourceTree = ""; }; 5E737A9A1F59696E00C0E28D /* Gist */ = { isa = PBXGroup; children = ( 5E737A9B1F59696E00C0E28D /* BFGistViewController.swift */, ); path = Gist; sourceTree = ""; }; 5E737A9C1F59696E00C0E28D /* Issue */ = { isa = PBXGroup; children = ( 5E737A9D1F59696E00C0E28D /* ViewCell */, ); path = Issue; sourceTree = ""; }; 5E737A9D1F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737A9E1F59696E00C0E28D /* CPMesIssueCell.swift */, 5E737A9F1F59696E00C0E28D /* CPMesIssueCell.xib */, ); path = ViewCell; sourceTree = ""; }; 5E737AA01F59696E00C0E28D /* Message */ = { isa = PBXGroup; children = ( 5EFC7B011F90A504006D5139 /* InsetNavigationBar.swift */, 5E737AA21F59696E00C0E28D /* BFMessageController.swift */, 5E2074E01F69955100B15203 /* BFMessageConentView.swift */, ); path = Message; sourceTree = ""; }; 5E737AA41F59696E00C0E28D /* Notification */ = { isa = PBXGroup; children = ( 5E737AA51F59696E00C0E28D /* ViewCell */, ); path = Notification; sourceTree = ""; }; 5E737AA51F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737AA61F59696E00C0E28D /* CPMesNotificationCell.swift */, 5E737AA71F59696E00C0E28D /* CPMesNotificationCell.xib */, ); path = ViewCell; sourceTree = ""; }; 5E737AA81F59696E00C0E28D /* Profile */ = { isa = PBXGroup; children = ( 5E0FE50D1E8FFFDA00356232 /* BFProfile.plist */, 5E8C117F1F6144FA0015B0FE /* ProfileModule.xcassets */, 5E737AAA1F59696E00C0E28D /* BFProfileController.swift */, 5E737AA91F59696E00C0E28D /* BFProfileController+Data.swift */, 5E6C24B120EFC1BE00373ED9 /* Feedback */, 5E737AAB1F59696E00C0E28D /* Funny */, 5E737AAE1F59696E00C0E28D /* Setting */, 5E737AB11F59696E00C0E28D /* StarTag */, 5E737AB61F59696E00C0E28D /* User */, 5E737AB91F59696E00C0E28D /* ViewCell */, ); path = Profile; sourceTree = ""; }; 5E737AAB1F59696E00C0E28D /* Funny */ = { isa = PBXGroup; children = ( 5E737AAC1F59696E00C0E28D /* CPFunnyAwardViewController.swift */, 5E737AAD1F59696E00C0E28D /* BFFunnyLabViewController.swift */, ); path = Funny; sourceTree = ""; }; 5E737AAE1F59696E00C0E28D /* Setting */ = { isa = PBXGroup; children = ( 5E0FE5031E8FFFDA00356232 /* BFAbout.plist */, 5E737AAF1F59696E00C0E28D /* BFAboutViewController.swift */, 5E737AB01F59696E00C0E28D /* BFSettingsViewController.swift */, ); path = Setting; sourceTree = ""; }; 5E737AB11F59696E00C0E28D /* StarTag */ = { isa = PBXGroup; children = ( 5EBEC3F120D943CC00ABDD4D /* BFReposSyncController.swift */, 5E737AB21F59696E00C0E28D /* BFAddNewTagsController.swift */, 5E737AB31F59696E00C0E28D /* BFListsManageController.swift */, 5E737AB51F59696E00C0E28D /* BFTagsManageController.swift */, 5EBEC3F720D9446F00ABDD4D /* BFRepoSync.plist */, ); path = StarTag; sourceTree = ""; }; 5E737AB61F59696E00C0E28D /* User */ = { isa = PBXGroup; children = ( 5E737AB71F59696E00C0E28D /* BFEditUserController.swift */, ); path = User; sourceTree = ""; }; 5E737AB91F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737ABC1F59696E00C0E28D /* CPPersonCardView.swift */, ); path = ViewCell; sourceTree = ""; }; 5E737ABF1F59696E00C0E28D /* Repository */ = { isa = PBXGroup; children = ( 5E0448A61F65ADE4001DD0B7 /* RepositoryCell */, 5E0448AF1F65ADE4001DD0B7 /* View */, 5E737AC11F59696E00C0E28D /* BFRepoDetailController.swift */, 5E737AC01F59696E00C0E28D /* BFRepoDetailController+Data.swift */, 5E737AC21F59696E00C0E28D /* BFRepoListController.swift */, ); path = Repository; sourceTree = ""; }; 5E737AC81F59696E00C0E28D /* Search */ = { isa = PBXGroup; children = ( 5E0447DD1F64E3F4001DD0B7 /* ResultResponse */, 5E8C11751F6136A90015B0FE /* SearchModel */, 5E737ACB1F59696E00C0E28D /* ViewCell */, 5E737AC91F59696E00C0E28D /* SESearchViewController.swift */, 5E8C11791F6140810015B0FE /* SESearchViewController+View.swift */, 5E737C8E1F5E143B00C0E28D /* SESearchResultController.swift */, 5EB55D091F61483600D6CB25 /* SESearchResultController+View.swift */, 5E51F6581F7CD984000DC150 /* SESearchResultController+Action.swift */, 5E51F6561F7CB95C000DC150 /* SESearchResultContentView.swift */, 5E8C117D1F6144B90015B0FE /* SearchModule.xcassets */, ); path = Search; sourceTree = ""; }; 5E737ACB1F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E8C117B1F6142990015B0FE /* SESearchOrderButton.swift */, 5EF837D51F66E10E009D4C09 /* SESearchCodeCell.swift */, ); path = ViewCell; sourceTree = ""; }; 5E737ACD1F59696E00C0E28D /* Settings */ = { isa = PBXGroup; children = ( ); path = Settings; sourceTree = ""; }; 5E737ACE1F59696E00C0E28D /* Stars */ = { isa = PBXGroup; children = ( 5E737AD31F59696E00C0E28D /* ViewCell */, 5E1A28891F7A828D00A60EE0 /* BFStarController.swift */, 5E1A288B1F7A8C3C00A60EE0 /* BFStarController+View.swift */, 5E1A288D1F7A8CE300A60EE0 /* BFStarController+Data.swift */, 5E1A288F1F7A98DC00A60EE0 /* BFStarController+Noti.swift */, 5E1A28871F7A7CFF00A60EE0 /* BFStarContentView.swift */, ); path = Stars; sourceTree = ""; }; 5E737AD31F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737AD61F59696E00C0E28D /* BFStarViewModel.swift */, 5E737AD71F59696E00C0E28D /* JSSegmentControl.swift */, ); path = ViewCell; sourceTree = ""; }; 5E737AD81F59696E00C0E28D /* Tag */ = { isa = PBXGroup; children = ( 5E737AD91F59696E00C0E28D /* BFUpdateTagsController.swift */, 5E737ADA1F59696E00C0E28D /* ListView */, 5E737ADC1F59696E00C0E28D /* TagView */, ); path = Tag; sourceTree = ""; }; 5E737ADA1F59696E00C0E28D /* ListView */ = { isa = PBXGroup; children = ( 5E737ADB1F59696E00C0E28D /* ListScrollView.swift */, ); path = ListView; sourceTree = ""; }; 5E737ADC1F59696E00C0E28D /* TagView */ = { isa = PBXGroup; children = ( 5E737ADD1F59696E00C0E28D /* AddTagsCell.swift */, 5E737ADE1F59696E00C0E28D /* AddTagsCell.xib */, 5E737ADF1F59696E00C0E28D /* JSScrollContentView.swift */, 5E737AE01F59696E00C0E28D /* JSTagBar.swift */, 5E737AE11F59696E00C0E28D /* JSTagItem.swift */, 5E737AE31F59696E00C0E28D /* ShowTagsCell.swift */, ); path = TagView; sourceTree = ""; }; 5E737AE41F59696E00C0E28D /* Trending */ = { isa = PBXGroup; children = ( 5E8FCF3E22C2075C00817E6F /* Model */, 5E737AE91F59696E00C0E28D /* ViewCell */, 5E737AE81F59696E00C0E28D /* BFTrendingController.swift */, 5E737AE61F59696E00C0E28D /* BFTrendingController+Data.swift */, 5E737AE71F59696E00C0E28D /* BFTrendingController+View.swift */, 5E737AE51F59696E00C0E28D /* BFShowcaseDetailController.swift */, ); path = Trending; sourceTree = ""; }; 5E737AE91F59696E00C0E28D /* ViewCell */ = { isa = PBXGroup; children = ( 5E737AEA1F59696E00C0E28D /* BFShowcaseHeaderView.swift */, 5E737AEB1F59696E00C0E28D /* BFShowcaseHeaderView.xib */, 5E737AF01F59696E00C0E28D /* BFTrendingShowcaseCell.swift */, 5E737AF11F59696E00C0E28D /* BFTrendingShowcaseCell.xib */, 5E737AF21F59696E00C0E28D /* CPFilterTableView.swift */, 5E737AF31F59696E00C0E28D /* InfoButton.swift */, 5EBAAE1E1F90AC29007BBAA8 /* BFTrendingSearchBar.swift */, ); path = ViewCell; sourceTree = ""; }; 5E737B4D1F596A1300C0E28D /* SystemManager */ = { isa = PBXGroup; children = ( 5E737B4E1F596A1300C0E28D /* Manager */, 5E737B5B1F596A1300C0E28D /* Network */, 5E737B651F596A1300C0E28D /* ProConfig */, 5E737B6C1F596A1300C0E28D /* Storage */, ); path = SystemManager; sourceTree = ""; }; 5E737B4E1F596A1300C0E28D /* Manager */ = { isa = PBXGroup; children = ( 5E66326120D8E8D7008F922D /* Push */, 5EBA24E8201E1D8300F097ED /* iCloud */, 5EBA24E7201E1D7700F097ED /* Oauth */, 5EBA24E6201E1CFB00F097ED /* ThirdParty */, 5EBA24E5201E1CD800F097ED /* Utils */, 5EBA24E4201E1CA000F097ED /* View */, ); path = Manager; sourceTree = ""; }; 5E737B5B1F596A1300C0E28D /* Network */ = { isa = PBXGroup; children = ( 5E98162420D8B837002DD1EE /* IdentityAndTrust.swift */, 5E737B541F596A1300C0E28D /* BFNetworkManager.swift */, 5EAF8D55209E01CE004D256B /* BFStatusCode.swift */, 5E737B5D1F596A1300C0E28D /* GitHubAPI.swift */, 5EB824591F637F54006EB085 /* SearchAPI.swift */, 5EA054EA208CD6BA009922AE /* BeeFunAPI.swift */, 5E737B5E1F596A1300C0E28D /* IssueAPI.swift */, 5E0448291F657097001DD0B7 /* EventAPI.swift */, 5E737B611F596A1300C0E28D /* Response+ObjectMapper.swift */, 5E737B601F596A1300C0E28D /* LanguageManager.swift */, 5E737B631F596A1300C0E28D /* SVGProcessor.swift */, 5E737B641F596A1300C0E28D /* TrendingManager.swift */, 5EA3BF3920A9CCCE00D3CC79 /* BeeFunDBManager.swift */, ); path = Network; sourceTree = ""; }; 5E737B651F596A1300C0E28D /* ProConfig */ = { isa = PBXGroup; children = ( 5E737B661F596A1300C0E28D /* BFCommonString.swift */, 5EAC2F142020679E000442FE /* BFUserDefaultManager.swift */, 5EB824551F63727E006EB085 /* BFPlistResourcesKey.swift */, 5E737B671F596A1300C0E28D /* BFNotificationName.swift */, 5E737B681F596A1300C0E28D /* BFStyleGuide.swift */, 5E737B691F596A1300C0E28D /* BFThirdLibKey.swift */, 5E737B6A1F596A1300C0E28D /* UIColor+Project.swift */, 5E737B6B1F596A1300C0E28D /* UIFont+Project.swift */, ); path = ProConfig; sourceTree = ""; }; 5E737B6C1F596A1300C0E28D /* Storage */ = { isa = PBXGroup; children = ( 5ECDD2181FD6725200A7E4F7 /* BFDocument.swift */, 5E737B701F596A1300C0E28D /* Manager */, 5E737B771F596A1300C0E28D /* Model */, ); path = Storage; sourceTree = ""; }; 5E737B701F596A1300C0E28D /* Manager */ = { isa = PBXGroup; children = ( 5E737B711F596A1300C0E28D /* SQLHelper.swift */, 5E737B721F596A1300C0E28D /* SQLLists.swift */, 5E737B731F596A1300C0E28D /* SQLManager.swift */, 5EAC2F0E20201A2C000442FE /* SQLConnection.swift */, 5EAC2F212022FC3E000442FE /* SQLStar+Delete.swift */, 5EAC2F1F2022FC3E000442FE /* SQLStar+Update.swift */, 5EAC2F242022FC3F000442FE /* SQLStars.swift */, 5EAC2F202022FC3E000442FE /* SQLStars+Base.swift */, 5EAC2F222022FC3F000442FE /* SQLStars+Find.swift */, 5EAC2F232022FC3F000442FE /* SQLTags.swift */, ); path = Manager; sourceTree = ""; }; 5E737B771F596A1300C0E28D /* Model */ = { isa = PBXGroup; children = ( 5E737B781F596A1300C0E28D /* ObjList.swift */, ); path = Model; sourceTree = ""; }; 5E737BA01F596A1D00C0E28D /* ToolKit */ = { isa = PBXGroup; children = ( 5E737BA11F596A1D00C0E28D /* JSToolKit */, ); path = ToolKit; sourceTree = ""; }; 5E737BA11F596A1D00C0E28D /* JSToolKit */ = { isa = PBXGroup; children = ( 5E737BA21F596A1D00C0E28D /* JSBridge */, 5E737BA91F596A1D00C0E28D /* JSFoundation */, 5E737BBD1F596A1D00C0E28D /* JSModel */, 5E737BC11F596A1D00C0E28D /* JSStyleGuide */, 5E737BC41F596A1D00C0E28D /* JSUI */, 5E737BDC1F596A1D00C0E28D /* JSUIKit */, 5E737BF71F596A1D00C0E28D /* README.md */, ); path = JSToolKit; sourceTree = ""; }; 5E737BA21F596A1D00C0E28D /* JSBridge */ = { isa = PBXGroup; children = ( 5E737BA31F596A1D00C0E28D /* JSHMSegmentedBridge.swift */, 5EA1B64F1F8CFF5D00DFAB7F /* JSMBHUDBridge.swift */, 5E737BA51F596A1D00C0E28D /* JSSQLiteSwiftBridge.swift */, 5E737BA61F596A1D00C0E28D /* JSSwiftyBeaver.swift */, 5E21B22D1F8CA61E002AC902 /* JSSVPHUDBridge.swift */, 5E008CCB1F8DC0D80007850F /* JSMBProgressHud.xcassets */, ); path = JSBridge; sourceTree = ""; }; 5E737BA91F596A1D00C0E28D /* JSFoundation */ = { isa = PBXGroup; children = ( 5E737BBB1F596A1D00C0E28D /* README.md */, 5E737C901F5E36EB00C0E28D /* JSUtilis.swift */, 5E737BAA1F596A1D00C0E28D /* Array+Extension.swift */, 5E737BAB1F596A1D00C0E28D /* Bundle+Extension.swift */, 5E737BAC1F596A1D00C0E28D /* Character+Extension.swift */, 5E737BAD1F596A1D00C0E28D /* Data+Extension.swift */, 5E737BAE1F596A1D00C0E28D /* Dictionary+Extension.swift */, 5E737BAF1F596A1D00C0E28D /* JSApp.swift */, 5E737BB01F596A1D00C0E28D /* JSAssociatedObject.swift */, 5E737BB11F596A1D00C0E28D /* JSClass.swift */, 5E737BB21F596A1D00C0E28D /* JSDebug.swift */, 5E737BB31F596A1D00C0E28D /* JSFoundation.swift */, 5E737BB41F596A1D00C0E28D /* JSFoundationGlobal.swift */, 5E737BB51F596A1D00C0E28D /* JSGCD.swift */, 5E737BB61F596A1D00C0E28D /* JSLanguage.swift */, 5E737BB71F596A1D00C0E28D /* JSObject.swift */, 5E737BB81F596A1D00C0E28D /* NSAttributedString+Size.swift */, 5E737BB91F596A1D00C0E28D /* NSObject+Extension.swift */, 5E737BBA1F596A1D00C0E28D /* NSString+Size.swift */, 5E737BBC1F596A1D00C0E28D /* String+Extension.swift */, 5EB357291F773DBB00734A01 /* DispatchQueue+Extension.swift */, ); path = JSFoundation; sourceTree = ""; }; 5E737BBD1F596A1D00C0E28D /* JSModel */ = { isa = PBXGroup; children = ( 5E737BBE1F596A1D00C0E28D /* README.md */, ); path = JSModel; sourceTree = ""; }; 5E737BC11F596A1D00C0E28D /* JSStyleGuide */ = { isa = PBXGroup; children = ( 5E737BC21F596A1D00C0E28D /* JSCommentStyleGudie.swift */, 5E737BC31F596A1D00C0E28D /* README.md */, ); path = JSStyleGuide; sourceTree = ""; }; 5E737BC41F596A1D00C0E28D /* JSUI */ = { isa = PBXGroup; children = ( 5E737BC51F596A1D00C0E28D /* TableViewCell */, 5EBAAE201F90B9CA007BBAA8 /* JSSearchBar.swift */, ); path = JSUI; sourceTree = ""; }; 5E737BC51F596A1D00C0E28D /* TableViewCell */ = { isa = PBXGroup; children = ( 5E737BC61F596A1D00C0E28D /* JSBaseCell.swift */, 5E737BC71F596A1D00C0E28D /* JSCellDefine.swift */, 5E737BC81F596A1D00C0E28D /* JSCellFactory.swift */, 5E737BC91F596A1D00C0E28D /* JSCellModel+Init.swift */, 5E737BCA1F596A1D00C0E28D /* JSCellModel.swift */, 5E737BCB1F596A1D00C0E28D /* JSCellModelFactory.swift */, 5E737BCC1F596A1D00C0E28D /* JSCellProtocol.swift */, 5E737BCD1F596A1D00C0E28D /* JSCellUtils.swift */, 5E737BCE1F596A1D00C0E28D /* JSEditCell.swift */, 5E737BCF1F596A1D00C0E28D /* JSEditCell.xib */, 5E737BD01F596A1D00C0E28D /* JSImageCell.swift */, 5E737BD11F596A1D00C0E28D /* JSImageCell.xib */, 5E737BD21F596A1D00C0E28D /* JSLabelCell.swift */, 5E737BD31F596A1D00C0E28D /* JSLabelCell.xib */, 5E737BD41F596A1D00C0E28D /* JSSelectedCell.swift */, 5E737BD51F596A1D00C0E28D /* JSSelectedCell.xib */, 5E737BD61F596A1D00C0E28D /* JSSubLabelCell.swift */, 5E737BD71F596A1D00C0E28D /* JSSubLabelCell.xib */, 5E737BD81F596A1D00C0E28D /* JSSwitchCell.swift */, 5E737BD91F596A1D00C0E28D /* JSSwitchCell.xib */, 5E737BDA1F596A1D00C0E28D /* README.md */, 5E737BDB1F596A1D00C0E28D /* TableViewCell.xcassets */, ); path = TableViewCell; sourceTree = ""; }; 5E737BDC1F596A1D00C0E28D /* JSUIKit */ = { isa = PBXGroup; children = ( 5E737BDD1F596A1D00C0E28D /* CGRect+Extension.swift */, 5E737BDE1F596A1D00C0E28D /* JSApperence.swift */, 5E737BDF1F596A1D00C0E28D /* JSApplication.swift */, 5E737BE01F596A1D00C0E28D /* JSCollectionViewCell.swift */, 5E737BE11F596A1D00C0E28D /* JSDevice.swift */, 5E737BE21F596A1D00C0E28D /* JSFileManager.swift */, 5E737BE31F596A1D00C0E28D /* JSNavigationController.swift */, 5E737BE41F596A1D00C0E28D /* JSTabBarController.swift */, 5E737BE61F596A1D00C0E28D /* JSUIGlobal.swift */, 5E737BE71F596A1D00C0E28D /* JSUIKit.swift */, 5E737BE81F596A1D00C0E28D /* JSViewController.swift */, 5E737BE91F596A1D00C0E28D /* NSMutableAttributedString.swift */, 5E737BEA1F596A1D00C0E28D /* README.md */, 5E737BEB1F596A1D00C0E28D /* UIAlertController+Extension.swift */, 5E737BEC1F596A1D00C0E28D /* UIColor+Extension.swift */, 5E737BED1F596A1D00C0E28D /* UIDevice+Device.swift */, 5E737BEE1F596A1D00C0E28D /* UIImage+Extension.swift */, 5E737BEF1F596A1D00C0E28D /* UILabel+Extension.swift */, 5E737BF01F596A1D00C0E28D /* UILabel+Size.swift */, 5E737BF11F596A1D00C0E28D /* UINavigationController+Pop.swift */, 5E737BF21F596A1D00C0E28D /* UIScreen+Size.swift */, 5E737BF31F596A1D00C0E28D /* UIStoryboard+Extension.swift */, 5E737BF41F596A1D00C0E28D /* UITextField+Extension.swift */, 5E737BF51F596A1D00C0E28D /* UIView+Draw.swift */, 5E737BF61F596A1D00C0E28D /* UIView+Nib.swift */, ); path = JSUIKit; sourceTree = ""; }; 5E87F6B31E820407001608F1 /* XcodeConfig */ = { isa = PBXGroup; children = ( 5E87F6B41E820407001608F1 /* Common.xcconfig */, 5E87F6B51E820407001608F1 /* Debug.xcconfig */, 5EC1499D1E828F90002039C2 /* Adhoc.xcconfig */, 5E87F6B61E820407001608F1 /* Release.xcconfig */, ); path = XcodeConfig; sourceTree = ""; }; 5E8C11751F6136A90015B0FE /* SearchModel */ = { isa = PBXGroup; children = ( 5E0447D51F64BC57001DD0B7 /* SESearchBaseModel.swift */, 5EB8245B1F638C8D006EB085 /* SESearchRepoModel.swift */, 5EB8245D1F638C9B006EB085 /* SESearchUserModel.swift */, 5EB8245F1F638CAA006EB085 /* SESearchWikiModel.swift */, 5EB824611F638CB6006EB085 /* SESearchCodeModel.swift */, 5EB824631F638CCB006EB085 /* SESearchIssueModel.swift */, 5EB824651F638CEC006EB085 /* SESearchCommitModel.swift */, ); path = SearchModel; sourceTree = ""; }; 5E8E4F37209B51840067CF39 /* BeeFunModel */ = { isa = PBXGroup; children = ( 5E8FCF5222C22BD000817E6F /* BeeFunResponseModel.swift */, 5E8E4F3A209B52430067CF39 /* GetAllTagResponse.swift */, 5E8E4F3C209B52610067CF39 /* ObjTag.swift */, 5EAF8D8A20A6A651004D256B /* GetReposResponse.swift */, 5E8FCF4E22C2128800817E6F /* BeeFunTrendingResponseModel.swift */, ); path = BeeFunModel; sourceTree = ""; }; 5E8FCF3E22C2075C00817E6F /* Model */ = { isa = PBXGroup; children = ( 5E8FCF3F22C2075C00817E6F /* BFExploreNavigationModel.swift */, 5E8FCF4022C2075C00817E6F /* BFGihubTrendingTimeEnum.swift */, 5E8FCF4122C2075C00817E6F /* BFGithubTrendingUserModel.swift */, 5E8FCF4222C2075C00817E6F /* BFGithubTrendingRequsetModel.swift */, 5E8FCF4322C2075C00817E6F /* BFGithubTrengingModel.swift */, ); path = Model; sourceTree = ""; }; 5EA61E771F7E327200AD8ACC /* NotUse */ = { isa = PBXGroup; children = ( 5EA61E781F7E327200AD8ACC /* BFEventCommitView.swift */, 5EA61E791F7E327200AD8ACC /* BFEventPRDetailView.swift */, 5EA61E7A1F7E327200AD8ACC /* BFEventTextView.swift */, 5EA61E7B1F7E327200AD8ACC /* BFEventTimeView.swift */, 5EA61E7C1F7E327200AD8ACC /* BFEventTitleView.swift */, 5EA61E7D1F7E327200AD8ACC /* BFEventView.swift */, 5EA61E7E1F7E327200AD8ACC /* BFImageViewAttachment.swift */, ); path = NotUse; sourceTree = ""; }; 5EBA24E4201E1CA000F097ED /* View */ = { isa = PBXGroup; children = ( 5E737B531F596A1300C0E28D /* MJRefreshManager.swift */, 5EE011791F6CA58100F3AF3B /* YYTextManager.swift */, ); path = View; sourceTree = ""; }; 5EBA24E5201E1CD800F097ED /* Utils */ = { isa = PBXGroup; children = ( 5E6C24AF20EFBFEB00373ED9 /* BFFeedbackManager.swift */, 5E1A28911F7B15F300A60EE0 /* BFTabbarManager.swift */, 5E737B591F596A1300C0E28D /* BFTimeHelper.swift */, 5E737B501F596A1300C0E28D /* BFGlobalHelper.swift */, 5E737B561F596A1300C0E28D /* PlistHelper.swift */, 5E737B511F596A1300C0E28D /* JumpManager.swift */, 5E737B5A1F596A1300C0E28D /* UserManager.swift */, 5EAC2F1120205462000442FE /* BFMonitor.swift */, 5EAC2F1020205462000442FE /* BFMonitor+Handle.swift */, 5EBEC3F920D95BCB00ABDD4D /* BFLanunchManager.swift */, ); path = Utils; sourceTree = ""; }; 5EBA24E6201E1CFB00F097ED /* ThirdParty */ = { isa = PBXGroup; children = ( 5E737B581F596A1300C0E28D /* ShareManager.swift */, 5E737B551F596A1300C0E28D /* PayManager.swift */, 5E737B4F1F596A1300C0E28D /* AnswerManager.swift */, 5E737B521F596A1300C0E28D /* KPIManager.swift */, 5E737B571F596A1300C0E28D /* PurchaseManager.swift */, ); path = ThirdParty; sourceTree = ""; }; 5EBA24E7201E1D7700F097ED /* Oauth */ = { isa = PBXGroup; children = ( 5EBA24D7201D82C000F097ED /* OAuthGithubWebController.swift */, 5EBA24D8201D82C100F097ED /* OAuthManager.swift */, ); path = Oauth; sourceTree = ""; }; 5EBA24E8201E1D8300F097ED /* iCloud */ = { isa = PBXGroup; children = ( 5EAC2F0C202019CD000442FE /* BFPathManager.swift */, 5EAC2F0A20201953000442FE /* BFZipManager.swift */, ); path = iCloud; sourceTree = ""; }; 5EF3C04E1E900FB900BDB8B0 /* Support Files */ = { isa = PBXGroup; children = ( 5E0FE4491E8FFFDA00356232 /* BeeFun-Bridging-Header.h */, 5E0FE5C61E8FFFDB00356232 /* LaunchScreen.strings */, 5E0FE4471E8FFFDA00356232 /* LaunchScreen.storyboard */, 5E0FE44E1E8FFFDA00356232 /* Main.storyboard */, ); name = "Support Files"; sourceTree = ""; }; DD25BC4C339CD1DA8D65519D /* Pods */ = { isa = PBXGroup; children = ( 69DA18879BDE528600046027 /* Pods-Coderpursue.debug.xcconfig */, 7C4A8DBCF2271C938FDD0F1B /* Pods-Coderpursue.release.xcconfig */, A45747E9B436E16CD67E3161 /* Pods-BeeFun.debug.xcconfig */, 28BC2F5A583018320065668C /* Pods-BeeFun.achoc.xcconfig */, 8B89AFF6A75319EC156E476E /* Pods-BeeFun.release.xcconfig */, ); name = Pods; sourceTree = ""; }; FEC0DC2D1C28B39E0008C7C1 = { isa = PBXGroup; children = ( 5E87F6B31E820407001608F1 /* XcodeConfig */, 5E0FE4421E8FFFDA00356232 /* BeeFun */, FEC0DC371C28B39F0008C7C1 /* Products */, 4D8F6ECC1AEDFB027177FDBB /* Frameworks */, DD25BC4C339CD1DA8D65519D /* Pods */, ); sourceTree = ""; }; FEC0DC371C28B39F0008C7C1 /* Products */ = { isa = PBXGroup; children = ( FEC0DC361C28B39F0008C7C1 /* BeeFun.app */, ); name = Products; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ FEC0DC351C28B39F0008C7C1 /* BeeFun */ = { isa = PBXNativeTarget; buildConfigurationList = FEC0DC601C28B39F0008C7C1 /* Build configuration list for PBXNativeTarget "BeeFun" */; buildPhases = ( D804F693A26BEDF21E8179BB /* [CP] Check Pods Manifest.lock */, FEC0DC321C28B39F0008C7C1 /* Sources */, FEC0DC331C28B39F0008C7C1 /* Frameworks */, FEC0DC341C28B39F0008C7C1 /* Resources */, 84E8F3EB511C0FDDEA01F8F0 /* [CP] Embed Pods Frameworks */, 5E9B5FE71E9CA01500BDCE49 /* Fabric */, 5E4559BD1EAD84B100CF2AC3 /* SwiftLint */, 5E2879F81F7B9CA800240A3C /* Integrate Reveal Server */, ); buildRules = ( ); dependencies = ( ); name = BeeFun; productName = Coderpursue; productReference = FEC0DC361C28B39F0008C7C1 /* BeeFun.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ FEC0DC2E1C28B39F0008C7C1 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; LastUpgradeCheck = 0930; ORGANIZATIONNAME = JungleSong; TargetAttributes = { FEC0DC351C28B39F0008C7C1 = { CreatedOnToolsVersion = 7.2; DevelopmentTeam = 69XHTLCF36; LastSwiftMigration = 0800; ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.BackgroundModes = { enabled = 1; }; com.apple.InAppPurchase = { enabled = 1; }; com.apple.Push = { enabled = 1; }; com.apple.iCloud = { enabled = 0; }; }; }; }; }; buildConfigurationList = FEC0DC311C28B39F0008C7C1 /* Build configuration list for PBXProject "BeeFun" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, "zh-Hans", ); mainGroup = FEC0DC2D1C28B39E0008C7C1; productRefGroup = FEC0DC371C28B39F0008C7C1 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( FEC0DC351C28B39F0008C7C1 /* BeeFun */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ FEC0DC341C28B39F0008C7C1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 5E0FE6351E8FFFDB00356232 /* tab_hot_sel@3x.png in Resources */, 5EB55D0D1F6187A700D6CB25 /* BFPopularLanguage.plist in Resources */, 5E737B441F59696E00C0E28D /* BFShowcaseHeaderView.xib in Resources */, 5E737B0D1F59696E00C0E28D /* CPMesIssueCell.xib in Resources */, 5E0448A21F65ADD4001DD0B7 /* BFUserTypeSecCell.xib in Resources */, 5E2816CF1FCCFE9D007A5159 /* WeiboSDK.bundle in Resources */, 5E0448B91F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.xib in Resources */, 5E0FE6481E8FFFDB00356232 /* BFProfile.plist in Resources */, 5E0FE6471E8FFFDB00356232 /* CPFilterLanguage.plist in Resources */, 5E0FE6361E8FFFDB00356232 /* tab_me@2x.png in Resources */, 5E737B4A1F59696E00C0E28D /* BFTrendingShowcaseCell.xib in Resources */, 5E0FE63D1E8FFFDB00356232 /* tab_mes_sel@3x.png in Resources */, 5E0FE63C1E8FFFDB00356232 /* tab_mes_sel@2x.png in Resources */, 5E737C501F596A1D00C0E28D /* JSImageCell.xib in Resources */, 5E0FE6311E8FFFDB00356232 /* tab_gist_sel@2x.png in Resources */, 5EBEC3F520D9446F00ABDD4D /* BFRepoSync.plist in Resources */, 5E0FE6371E8FFFDB00356232 /* tab_me@3x.png in Resources */, 5E8C117E1F6144B90015B0FE /* SearchModule.xcassets in Resources */, 5E2816CD1FCCFE9D007A5159 /* TencentOpenApi_IOS_Bundle.bundle in Resources */, 5E0FE63A1E8FFFDB00356232 /* tab_mes@2x.png in Resources */, 5EDCB1211F14EA0200DC844D /* BFLanguage.plist in Resources */, 5E737C4E1F596A1D00C0E28D /* JSEditCell.xib in Resources */, 5E6AE53F1F91742A00813B6C /* Event.xcassets in Resources */, 5E737B391F59696E00C0E28D /* AddTagsCell.xib in Resources */, 5E737C521F596A1D00C0E28D /* JSLabelCell.xib in Resources */, 5E0FE6331E8FFFDB00356232 /* tab_hot@3x.png in Resources */, 5E737C581F596A1D00C0E28D /* JSSwitchCell.xib in Resources */, 5E0FE5CC1E8FFFDB00356232 /* LaunchScreen.storyboard in Resources */, 5E0448A01F65ADD4001DD0B7 /* BFUserTypeOneCell.xib in Resources */, 5E0FE5CE1E8FFFDB00356232 /* Main.storyboard in Resources */, 5E008CCC1F8DC0D80007850F /* JSMBProgressHud.xcassets in Resources */, 5E2816C11FCCFE9D007A5159 /* ShareSDKConfigFile.bundle in Resources */, 5E0FE6421E8FFFDB00356232 /* Localizable.strings in Resources */, 5E0448B71F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.xib in Resources */, 5E0448B31F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.xib in Resources */, 5E2816D21FCCFE9D007A5159 /* ShareSDK.bundle in Resources */, 5E2816D11FCCFE9D007A5159 /* README.txt in Resources */, 5E0FE6491E8FFFDB00356232 /* BFSetting.plist in Resources */, 5E0448B51F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.xib in Resources */, 5E737C541F596A1D00C0E28D /* JSSelectedCell.xib in Resources */, 5E0FE6301E8FFFDB00356232 /* tab_gist@2x.png in Resources */, 5E0FE63B1E8FFFDB00356232 /* tab_mes@3x.png in Resources */, 5E0FE6431E8FFFDB00356232 /* BFAbout.plist in Resources */, 5E0FE6321E8FFFDB00356232 /* tab_hot@2x.png in Resources */, 5E0FE6391E8FFFDB00356232 /* tab_me_sel@3x.png in Resources */, 5E737C561F596A1D00C0E28D /* JSSubLabelCell.xib in Resources */, 5E0FE6461E8FFFDB00356232 /* CPCountry.plist in Resources */, 5E0FE6401E8FFFDB00356232 /* tab_star_sel@2x.png in Resources */, 5E0FE63E1E8FFFDB00356232 /* tab_star@2x.png in Resources */, 5E0FE6381E8FFFDB00356232 /* tab_me_sel@2x.png in Resources */, 5E0FE6BD1E8FFFDB00356232 /* LaunchScreen.strings in Resources */, 5E0FE6451E8FFFDB00356232 /* CPCity.plist in Resources */, 5E0FE6341E8FFFDB00356232 /* tab_hot_sel@2x.png in Resources */, 5E737C5A1F596A1D00C0E28D /* TableViewCell.xcassets in Resources */, 5E2816C41FCCFE9D007A5159 /* ShareSDKUI.bundle in Resources */, 5E0FE6411E8FFFDB00356232 /* tab_star_sel@3x.png in Resources */, 5E66326020D8BED5008F922D /* beefuntop.p12 in Resources */, 5E0FE63F1E8FFFDB00356232 /* tab_star@3x.png in Resources */, 5E8C11801F6144FA0015B0FE /* ProfileModule.xcassets in Resources */, 5E737B121F59696E00C0E28D /* CPMesNotificationCell.xib in Resources */, 5E0448A41F65ADD4001DD0B7 /* BFUserTypeThirdCell.xib in Resources */, 5E0FE5CA1E8FFFDB00356232 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 5E2879F81F7B9CA800240A3C /* Integrate Reveal Server */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Integrate Reveal Server"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "REVEAL_APP_PATH=$(mdfind kMDItemCFBundleIdentifier=\"com.ittybittyapps.Reveal2\" | head -n 1)\nBUILD_SCRIPT_PATH=\"${REVEAL_APP_PATH}/Contents/SharedSupport/Scripts/reveal_server_build_phase.sh\"\nif [ \"${REVEAL_APP_PATH}\" -a -e \"${BUILD_SCRIPT_PATH}\" ]; then\n\"${BUILD_SCRIPT_PATH}\"\nelse\necho \"Reveal Server not loaded: Cannot find a compatible Reveal app.\"\nfi"; }; 5E4559BD1EAD84B100CF2AC3 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = SwiftLint; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "echo \"warning: SwiftLint skipped for local compatibility build\""; }; 5E9B5FE71E9CA01500BDCE49 /* Fabric */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = Fabric; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Fabric/run\" e7fc6fe67f5ece8c9c70144eafeb17ac57c79885 40844138f95957ce46455d2e692c39326bf61876b2d4d901a99359202e0bed16"; }; 84E8F3EB511C0FDDEA01F8F0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-BeeFun/Pods-BeeFun-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", "${BUILT_PRODUCTS_DIR}/HMSegmentedControl/HMSegmentedControl.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework", "${BUILT_PRODUCTS_DIR}/Kanna/Kanna.framework", "${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework", "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework", "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework", "${BUILT_PRODUCTS_DIR}/Moya/Moya.framework", "${BUILT_PRODUCTS_DIR}/OAuthSwift/OAuthSwift.framework", "${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework", "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", "${BUILT_PRODUCTS_DIR}/Result/Result.framework", "${BUILT_PRODUCTS_DIR}/SQLite.swift/SQLite.framework", "${BUILT_PRODUCTS_DIR}/SkeletonView/SkeletonView.framework", "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework", "${BUILT_PRODUCTS_DIR}/SwiftMessages/SwiftMessages.framework", "${BUILT_PRODUCTS_DIR}/SwiftyBeaver/SwiftyBeaver.framework", "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework", "${BUILT_PRODUCTS_DIR}/SwiftyStoreKit/SwiftyStoreKit.framework", "${BUILT_PRODUCTS_DIR}/SwipeCellKit/SwipeCellKit.framework", "${BUILT_PRODUCTS_DIR}/TOWebViewController/TOWebViewController.framework", "${BUILT_PRODUCTS_DIR}/YYText/YYText.framework", "${BUILT_PRODUCTS_DIR}/iCarousel/iCarousel.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HMSegmentedControl.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kanna.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OAuthSwift.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SQLite.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SkeletonView.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftMessages.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyBeaver.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyJSON.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyStoreKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwipeCellKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TOWebViewController.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYText.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/iCarousel.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BeeFun/Pods-BeeFun-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; D804F693A26BEDF21E8179BB /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( "$(DERIVED_FILE_DIR)/Pods-BeeFun-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ FEC0DC321C28B39F0008C7C1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 5E737C371F596A1D00C0E28D /* JSFoundation.swift in Sources */, 5E8C117C1F6142990015B0FE /* SESearchOrderButton.swift in Sources */, 5E737C601F596A1D00C0E28D /* JSFileManager.swift in Sources */, 5E737B371F59696E00C0E28D /* ListScrollView.swift in Sources */, 5E737C671F596A1D00C0E28D /* NSMutableAttributedString.swift in Sources */, 5E737C4F1F596A1D00C0E28D /* JSImageCell.swift in Sources */, 5E0FE6241E8FFFDB00356232 /* ObjUser.swift in Sources */, 5E737C8F1F5E143B00C0E28D /* SESearchResultController.swift in Sources */, 5E737C3C1F596A1D00C0E28D /* NSAttributedString+Size.swift in Sources */, 5EA61E811F7E327200AD8ACC /* BFEventTextView.swift in Sources */, 5E737B4C1F59696E00C0E28D /* InfoButton.swift in Sources */, 5EBA24D9201D82C100F097ED /* OAuthGithubWebController.swift in Sources */, 5E737C701F596A1D00C0E28D /* UIScreen+Size.swift in Sources */, 5E737C321F596A1D00C0E28D /* Dictionary+Extension.swift in Sources */, 5E737B381F59696E00C0E28D /* AddTagsCell.swift in Sources */, 5E0447E91F64FB2C001DD0B7 /* SEResponseWikis.swift in Sources */, 5E0448B41F65ADE4001DD0B7 /* BFRepositoryTypeOneCell.swift in Sources */, 5E737B3C1F59696E00C0E28D /* JSTagItem.swift in Sources */, 5EAC2F0D202019CD000442FE /* BFPathManager.swift in Sources */, 5E737B831F596A1300C0E28D /* ShareManager.swift in Sources */, 5EA054EB208CD6BA009922AE /* BeeFunAPI.swift in Sources */, 5E737C361F596A1D00C0E28D /* JSDebug.swift in Sources */, 5E0FE6111E8FFFDB00356232 /* ObjErropReponse.swift in Sources */, 5E8FCF4822C2075D00817E6F /* BFGithubTrengingModel.swift in Sources */, 5E0447D61F64BC57001DD0B7 /* SESearchBaseModel.swift in Sources */, 5EC1F33920C23B3700792C93 /* BFPlaceHolderView.swift in Sources */, 5E737C6D1F596A1D00C0E28D /* UILabel+Extension.swift in Sources */, 5E0FE60A1E8FFFDB00356232 /* ObjNotification.swift in Sources */, 5EAC2F0B20201953000442FE /* BFZipManager.swift in Sources */, 5E737C4B1F596A1D00C0E28D /* JSCellProtocol.swift in Sources */, 5E737B851F596A1300C0E28D /* UserManager.swift in Sources */, 5EA61E761F7E2DDC00AD8ACC /* BFEventParase.swift in Sources */, 5E737B0C1F59696E00C0E28D /* CPMesIssueCell.swift in Sources */, 5E0FE5C91E8FFFDB00356232 /* AppDelegate.swift in Sources */, 5E737B841F596A1300C0E28D /* BFTimeHelper.swift in Sources */, 5E0447E11F64E456001DD0B7 /* SEResponseUsers.swift in Sources */, 5E47F69E1F79F15100D24180 /* ObjRelease.swift in Sources */, 5E737C2B1F596A1D00C0E28D /* JSSQLiteSwiftBridge.swift in Sources */, 5E0FE6231E8FFFDB00356232 /* ObjPlan.swift in Sources */, 5EAEF74A20EC5C6900DB76BC /* BFFeedbackController.swift in Sources */, 5E737B111F59696E00C0E28D /* CPMesNotificationCell.swift in Sources */, 5E737B3E1F59696E00C0E28D /* ShowTagsCell.swift in Sources */, 5E737B8F1F596A1300C0E28D /* BFCommonString.swift in Sources */, 5E737C731F596A1D00C0E28D /* UIView+Draw.swift in Sources */, 5E0448A31F65ADD4001DD0B7 /* BFUserTypeThirdCell.swift in Sources */, 5E737C381F596A1D00C0E28D /* JSFoundationGlobal.swift in Sources */, 5E737C741F596A1D00C0E28D /* UIView+Nib.swift in Sources */, 5E737C551F596A1D00C0E28D /* JSSubLabelCell.swift in Sources */, 5E737C341F596A1D00C0E28D /* JSAssociatedObject.swift in Sources */, 5E737B7C1F596A1300C0E28D /* JumpManager.swift in Sources */, 5E737B921F596A1300C0E28D /* BFThirdLibKey.swift in Sources */, 5E0448B61F65ADE4001DD0B7 /* BFRepositoryTypeSecCell.swift in Sources */, 5E737C2C1F596A1D00C0E28D /* JSSwiftyBeaver.swift in Sources */, 5E8E4F3B209B52430067CF39 /* GetAllTagResponse.swift in Sources */, 5E737C691F596A1D00C0E28D /* UIAlertController+Extension.swift in Sources */, 5EB824641F638CCB006EB085 /* SESearchIssueModel.swift in Sources */, 5E737B1D1F59696E00C0E28D /* BFEditUserController.swift in Sources */, 5E737B8D1F596A1300C0E28D /* SVGProcessor.swift in Sources */, 5EB357141F76096200734A01 /* BFEventLayout.swift in Sources */, 5EAC2F2A2022FC3F000442FE /* SQLStars.swift in Sources */, 5E1A288A1F7A828D00A60EE0 /* BFStarController.swift in Sources */, 5EAF8D8B20A6A651004D256B /* GetReposResponse.swift in Sources */, 5E737B991F596A1300C0E28D /* SQLLists.swift in Sources */, 5E0447E01F64E456001DD0B7 /* SEResponseRepos.swift in Sources */, 5E8FCF5322C22BD100817E6F /* BeeFunResponseModel.swift in Sources */, 5E737C491F596A1D00C0E28D /* JSCellModel.swift in Sources */, 5E0FE6091E8FFFDB00356232 /* ObjEventPayload.swift in Sources */, 5E0FE6121E8FFFDB00356232 /* ObjError.swift in Sources */, 5E1A28861F7A4CB300A60EE0 /* ObjMember.swift in Sources */, 5E8FCF4F22C2128800817E6F /* BeeFunTrendingResponseModel.swift in Sources */, 5EB824561F63727E006EB085 /* BFPlistResourcesKey.swift in Sources */, 5EBAAE211F90B9CA007BBAA8 /* JSSearchBar.swift in Sources */, 5E737B3A1F59696E00C0E28D /* JSScrollContentView.swift in Sources */, 5EB824621F638CB6006EB085 /* SESearchCodeModel.swift in Sources */, 5E0FE6151E8FFFDB00356232 /* ObjBase.swift in Sources */, 5EB357161F760A0C00734A01 /* BFEventBaseCell.swift in Sources */, 5E737C571F596A1D00C0E28D /* JSSwitchCell.swift in Sources */, 5EA3BF3A20A9CCCE00D3CC79 /* BeeFunDBManager.swift in Sources */, 5E737B261F59696E00C0E28D /* BFRepoListController.swift in Sources */, 5E737B0B1F59696E00C0E28D /* BFGistViewController.swift in Sources */, 5EA61E821F7E327200AD8ACC /* BFEventTimeView.swift in Sources */, 5E0FE6061E8FFFDB00356232 /* ObjComment.swift in Sources */, 5E737B361F59696E00C0E28D /* BFUpdateTagsController.swift in Sources */, 5EAF8D56209E01CE004D256B /* BFStatusCode.swift in Sources */, 5EFE2C781F6B44750040FC3C /* ObjLinks.swift in Sources */, 5EAC2F0F20201A2C000442FE /* SQLConnection.swift in Sources */, 5E737C721F596A1D00C0E28D /* UITextField+Extension.swift in Sources */, 5E737B401F59696E00C0E28D /* BFTrendingController+Data.swift in Sources */, 5E737C291F596A1D00C0E28D /* JSHMSegmentedBridge.swift in Sources */, 5E737C5B1F596A1D00C0E28D /* CGRect+Extension.swift in Sources */, 5E737B881F596A1300C0E28D /* IssueAPI.swift in Sources */, 5EC1F33720C2339E00792C93 /* BFBaseViewController+Empty.swift in Sources */, 5EA61E801F7E327200AD8ACC /* BFEventPRDetailView.swift in Sources */, 5E737C3A1F596A1D00C0E28D /* JSLanguage.swift in Sources */, 5EAC2F1220205462000442FE /* BFMonitor+Handle.swift in Sources */, 5E0FE6251E8FFFDB00356232 /* ObjUserSum.swift in Sources */, 5EB357281F76B90700734A01 /* BFEventConstants.swift in Sources */, 5E737B1A1F59696E00C0E28D /* BFListsManageController.swift in Sources */, 5E737B351F59696E00C0E28D /* JSSegmentControl.swift in Sources */, 5E737C4D1F596A1D00C0E28D /* JSEditCell.swift in Sources */, 5E737C5F1F596A1D00C0E28D /* JSDevice.swift in Sources */, 5E2074E11F69955100B15203 /* BFMessageConentView.swift in Sources */, 5E0FE60B1E8FFFDB00356232 /* ObjSubject.swift in Sources */, 5E737B901F596A1300C0E28D /* BFNotificationName.swift in Sources */, 5EBA24DA201D82C100F097ED /* OAuthManager.swift in Sources */, 5EAC2F262022FC3F000442FE /* SQLStars+Base.swift in Sources */, 5EFE2C7A1F6B45520040FC3C /* ObjHref.swift in Sources */, 5E737B421F59696E00C0E28D /* BFTrendingController.swift in Sources */, 5E737C391F596A1D00C0E28D /* JSGCD.swift in Sources */, 5E737B2B1F59696E00C0E28D /* SESearchViewController.swift in Sources */, 5EAF8D9120A6D2D2004D256B /* ObjRepos.swift in Sources */, 5E737B0F1F59696E00C0E28D /* BFMessageController.swift in Sources */, 5E737C301F596A1D00C0E28D /* Character+Extension.swift in Sources */, 5E1A28901F7A98DC00A60EE0 /* BFStarController+Noti.swift in Sources */, 5E47F6A41F7A29D000D24180 /* ObjDeploymentPayload.swift in Sources */, 5EB824661F638CEC006EB085 /* SESearchCommitModel.swift in Sources */, 5E737B171F59696E00C0E28D /* BFAboutViewController.swift in Sources */, 5E737C481F596A1D00C0E28D /* JSCellModel+Init.swift in Sources */, 5E8FCF4722C2075D00817E6F /* BFGithubTrendingRequsetModel.swift in Sources */, 5E0447F91F653177001DD0B7 /* BFWebViewController.swift in Sources */, 5E737C531F596A1D00C0E28D /* JSSelectedCell.swift in Sources */, 5E737C2F1F596A1D00C0E28D /* Bundle+Extension.swift in Sources */, 5E0FE6141E8FFFDB00356232 /* ObjResponser.swift in Sources */, 5E0448041F6531B0001DD0B7 /* BFUserListController.swift in Sources */, 5E737C4A1F596A1D00C0E28D /* JSCellModelFactory.swift in Sources */, 5E737B941F596A1300C0E28D /* UIFont+Project.swift in Sources */, 5E98162520D8B837002DD1EE /* IdentityAndTrust.swift in Sources */, 5ECDD2191FD6725200A7E4F7 /* BFDocument.swift in Sources */, 5EB8245E1F638C9B006EB085 /* SESearchUserModel.swift in Sources */, 5E0FE6101E8FFFDB00356232 /* AppToken.swift in Sources */, 5E8FCF4522C2075C00817E6F /* BFGihubTrendingTimeEnum.swift in Sources */, 5E737B7A1F596A1300C0E28D /* AnswerManager.swift in Sources */, 5E1A288C1F7A8C3C00A60EE0 /* BFStarController+View.swift in Sources */, 5E737C311F596A1D00C0E28D /* Data+Extension.swift in Sources */, 5E737B161F59696E00C0E28D /* BFFunnyLabViewController.swift in Sources */, 5E737C511F596A1D00C0E28D /* JSLabelCell.swift in Sources */, 5E737B191F59696E00C0E28D /* BFAddNewTagsController.swift in Sources */, 5EF837D61F66E10E009D4C09 /* SESearchCodeCell.swift in Sources */, 5E0FE6161E8FFFDB00356232 /* ObjSettings.swift in Sources */, 5EAC2F292022FC3F000442FE /* SQLTags.swift in Sources */, 5E0447F81F653177001DD0B7 /* BFBaseViewController.swift in Sources */, 5E737C331F596A1D00C0E28D /* JSApp.swift in Sources */, 5E1A288E1F7A8CE300A60EE0 /* BFStarController+Data.swift in Sources */, 5E1A28881F7A7CFF00A60EE0 /* BFStarContentView.swift in Sources */, 5EFDFA5920C25D5200998B84 /* BFEmptyDataCell.swift in Sources */, 5EFE2C761F6B42A40040FC3C /* ObjBranch.swift in Sources */, 5EAC2F252022FC3F000442FE /* SQLStar+Update.swift in Sources */, 5E737C6A1F596A1D00C0E28D /* UIColor+Extension.swift in Sources */, 5E737B1C1F59696E00C0E28D /* BFTagsManageController.swift in Sources */, 5E737B3B1F59696E00C0E28D /* JSTagBar.swift in Sources */, 5E0447F41F653177001DD0B7 /* BFBaseViewController+Answer.swift in Sources */, 5E737B871F596A1300C0E28D /* GitHubAPI.swift in Sources */, 5E737C5E1F596A1D00C0E28D /* JSCollectionViewCell.swift in Sources */, 5E737B981F596A1300C0E28D /* SQLHelper.swift in Sources */, 5E6C24AE20EFBA1D00373ED9 /* BFFeedbackIssueController.swift in Sources */, 5E737B141F59696E00C0E28D /* BFProfileController.swift in Sources */, 5E737B431F59696E00C0E28D /* BFShowcaseHeaderView.swift in Sources */, 5E737C5C1F596A1D00C0E28D /* JSApperence.swift in Sources */, 5E21B22E1F8CA61E002AC902 /* JSSVPHUDBridge.swift in Sources */, 5EBEC3FA20D95BCB00ABDD4D /* BFLanunchManager.swift in Sources */, 5E0447F61F653177001DD0B7 /* BFBaseViewController+Refresh.swift in Sources */, 5E737B801F596A1300C0E28D /* PayManager.swift in Sources */, 5EAC2F272022FC3F000442FE /* SQLStar+Delete.swift in Sources */, 5E8C117A1F6140810015B0FE /* SESearchViewController+View.swift in Sources */, 5EFC7B021F90A504006D5139 /* InsetNavigationBar.swift in Sources */, 5E737C351F596A1D00C0E28D /* JSClass.swift in Sources */, 5E0447E31F64FB09001DD0B7 /* SEResponseIssues.swift in Sources */, 5E737B211F59696E00C0E28D /* CPPersonCardView.swift in Sources */, 5E260E9020CB9EC70075B8C3 /* JPushManager.swift in Sources */, 5E0447F51F653177001DD0B7 /* BFBaseViewController+Nav.swift in Sources */, 5E51F6571F7CB95C000DC150 /* SESearchResultContentView.swift in Sources */, 5E0447F31F653177001DD0B7 /* BFBaseTabBarController.swift in Sources */, 5E6AE5411F9178A500813B6C /* ObjPage.swift in Sources */, 5E04489F1F65ADD4001DD0B7 /* BFUserTypeOneCell.swift in Sources */, 5E0447E51F64FB17001DD0B7 /* SEResponseCode.swift in Sources */, 5E737B7F1F596A1300C0E28D /* BFNetworkManager.swift in Sources */, 5EA61E851F7E327200AD8ACC /* BFImageViewAttachment.swift in Sources */, 5E0FE60C1E8FFFDB00356232 /* ObjIssue.swift in Sources */, 5E737C431F596A1D00C0E28D /* JSCommentStyleGudie.swift in Sources */, 5E737C6C1F596A1D00C0E28D /* UIImage+Extension.swift in Sources */, 5EFDFA5D20C2F1ED00998B84 /* BFBaseViewController+Noti.swift in Sources */, 5E1A28921F7B15F300A60EE0 /* BFTabbarManager.swift in Sources */, 5EB3572A1F773DBB00734A01 /* DispatchQueue+Extension.swift in Sources */, 5E737C6E1F596A1D00C0E28D /* UILabel+Size.swift in Sources */, 5ECAE4FE201EB9A100DB6AD5 /* ObjGithubStarRepos.swift in Sources */, 5EB357121F76095600734A01 /* BFEventCell.swift in Sources */, 5E0FE6051E8FFFDB00356232 /* DataModel.swift in Sources */, 5E737B3F1F59696E00C0E28D /* BFShowcaseDetailController.swift in Sources */, 5E0448B21F65ADE4001DD0B7 /* BFRepositoryTypeFourCell.swift in Sources */, 5E0448B81F65ADE4001DD0B7 /* BFRepositoryTypeThirdCell.swift in Sources */, 5E47F6A01F7A07AC00D24180 /* ObjAsset.swift in Sources */, 5EA1B6501F8CFF5D00DFAB7F /* JSMBHUDBridge.swift in Sources */, 5E0448A51F65ADD4001DD0B7 /* CPDeveloperInfoView.swift in Sources */, 5E737C661F596A1D00C0E28D /* JSViewController.swift in Sources */, 5EB8245A1F637F54006EB085 /* SearchAPI.swift in Sources */, 5EE0117A1F6CA58100F3AF3B /* YYTextManager.swift in Sources */, 5E0447E71F64FB22001DD0B7 /* SEResponseCommits.swift in Sources */, 5E737C401F596A1D00C0E28D /* String+Extension.swift in Sources */, 5E737B411F59696E00C0E28D /* BFTrendingController+View.swift in Sources */, 5EAC2F1320205462000442FE /* BFMonitor.swift in Sources */, 5ECAE4FF201EB9A100DB6AD5 /* ObjReposSum.swift in Sources */, 5E048A70213159A20098CBF6 /* BFNewTrendingController.swift in Sources */, 5E737B491F59696E00C0E28D /* BFTrendingShowcaseCell.swift in Sources */, 5EB824601F638CAA006EB085 /* SESearchWikiModel.swift in Sources */, 5E0448031F6531B0001DD0B7 /* BFUserDetailController.swift in Sources */, 5E0448BB1F65ADE4001DD0B7 /* CPReposPosterView.swift in Sources */, 5E8FCF4422C2075C00817E6F /* BFExploreNavigationModel.swift in Sources */, 5E737B241F59696E00C0E28D /* BFRepoDetailController+Data.swift in Sources */, 5E0FE6221E8FFFDB00356232 /* ObjPermissions.swift in Sources */, 5EAC2F282022FC3F000442FE /* SQLStars+Find.swift in Sources */, 5E737B821F596A1300C0E28D /* PurchaseManager.swift in Sources */, 5EFE2C721F6B3E140040FC3C /* ObjPullRequest.swift in Sources */, 5E737B8B1F596A1300C0E28D /* Response+ObjectMapper.swift in Sources */, 5E737B911F596A1300C0E28D /* BFStyleGuide.swift in Sources */, 5E737B341F59696E00C0E28D /* BFStarViewModel.swift in Sources */, 5E737B8E1F596A1300C0E28D /* TrendingManager.swift in Sources */, 5E8FCF5122C21B3600817E6F /* NetFilter.swift in Sources */, 5EF837D41F66DF28009D4C09 /* ObjSearchCode.swift in Sources */, 5E737B8A1F596A1300C0E28D /* LanguageManager.swift in Sources */, 5E0FE6131E8FFFDB00356232 /* ObjResponseHeader.swift in Sources */, 5E47F6A21F7A28F700D24180 /* ObjDeployment.swift in Sources */, 5E737C3D1F596A1D00C0E28D /* NSObject+Extension.swift in Sources */, 5E737C3E1F596A1D00C0E28D /* NSString+Size.swift in Sources */, 5EA61E841F7E327200AD8ACC /* BFEventView.swift in Sources */, 5E0FE6201E8FFFDB00356232 /* ObjShowcase.swift in Sources */, 5E737C471F596A1D00C0E28D /* JSCellFactory.swift in Sources */, 5E737C5D1F596A1D00C0E28D /* JSApplication.swift in Sources */, 5EFDFA5B20C2E48300998B84 /* BFBaseViewController+Login.swift in Sources */, 5E737C4C1F596A1D00C0E28D /* JSCellUtils.swift in Sources */, 5E737B931F596A1300C0E28D /* UIColor+Project.swift in Sources */, 5E6C24B020EFBFEB00373ED9 /* BFFeedbackManager.swift in Sources */, 5E8FCF4622C2075D00817E6F /* BFGithubTrendingUserModel.swift in Sources */, 5E737C621F596A1D00C0E28D /* JSTabBarController.swift in Sources */, 5E737C461F596A1D00C0E28D /* JSCellDefine.swift in Sources */, 5EA61E7F1F7E327200AD8ACC /* BFEventCommitView.swift in Sources */, 5E737AFC1F59696E00C0E28D /* BFSwipeCell.swift in Sources */, 5E737C6F1F596A1D00C0E28D /* UINavigationController+Pop.swift in Sources */, 5E737C6B1F596A1D00C0E28D /* UIDevice+Device.swift in Sources */, 5EAC2F152020679E000442FE /* BFUserDefaultManager.swift in Sources */, 5E737C2E1F596A1D00C0E28D /* Array+Extension.swift in Sources */, 5E737C911F5E36EB00C0E28D /* JSUtilis.swift in Sources */, 5E737B7D1F596A1300C0E28D /* KPIManager.swift in Sources */, 5E0FE6211E8FFFDB00356232 /* ObjEmail.swift in Sources */, 5E51F6591F7CD984000DC150 /* SESearchResultController+Action.swift in Sources */, 5EE6438820D8F4B300F47E43 /* BFMessageManager.swift in Sources */, 5E737B7E1F596A1300C0E28D /* MJRefreshManager.swift in Sources */, 5EBAAE1F1F90AC29007BBAA8 /* BFTrendingSearchBar.swift in Sources */, 5EA61E831F7E327200AD8ACC /* BFEventTitleView.swift in Sources */, 5E737B9E1F596A1300C0E28D /* ObjList.swift in Sources */, 5E737C451F596A1D00C0E28D /* JSBaseCell.swift in Sources */, 5E0448BA1F65ADE4001DD0B7 /* CPReposInfoView.swift in Sources */, 5E0FE6081E8FFFDB00356232 /* ObjEvent.swift in Sources */, 5EB55D0A1F61483600D6CB25 /* SESearchResultController+View.swift in Sources */, 5E737C651F596A1D00C0E28D /* JSUIKit.swift in Sources */, 5E0448A11F65ADD4001DD0B7 /* BFUserTypeSecCell.swift in Sources */, 5E737C711F596A1D00C0E28D /* UIStoryboard+Extension.swift in Sources */, 5E0FE60D1E8FFFDB00356232 /* ObjLabel.swift in Sources */, 5E737C3B1F596A1D00C0E28D /* JSObject.swift in Sources */, 5E737B9A1F596A1300C0E28D /* SQLManager.swift in Sources */, 5E8E4F3D209B52610067CF39 /* ObjTag.swift in Sources */, 5E737B4B1F59696E00C0E28D /* CPFilterTableView.swift in Sources */, 5EB8245C1F638C8D006EB085 /* SESearchRepoModel.swift in Sources */, 5E0FE60E1E8FFFDB00356232 /* ObjMilestone.swift in Sources */, 5E04482A1F657097001DD0B7 /* EventAPI.swift in Sources */, 5E737C641F596A1D00C0E28D /* JSUIGlobal.swift in Sources */, 5E737AFB1F59696E00C0E28D /* BFBaseCell.swift in Sources */, 5E737B251F59696E00C0E28D /* BFRepoDetailController.swift in Sources */, 5E737B151F59696E00C0E28D /* CPFunnyAwardViewController.swift in Sources */, 5E737B131F59696E00C0E28D /* BFProfileController+Data.swift in Sources */, 5EBEC3F220D943CC00ABDD4D /* BFReposSyncController.swift in Sources */, 5E737B7B1F596A1300C0E28D /* BFGlobalHelper.swift in Sources */, 5E737B811F596A1300C0E28D /* PlistHelper.swift in Sources */, 5E737C611F596A1D00C0E28D /* JSNavigationController.swift in Sources */, 5E737B181F59696E00C0E28D /* BFSettingsViewController.swift in Sources */, 5E0FE6071E8FFFDB00356232 /* ObjCommit.swift in Sources */, 5E0447F71F653177001DD0B7 /* BFBaseViewController+TableView.swift in Sources */, 5E03B08720C03D5200D3561E /* BFBaseViewController+Reload.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 5E0FE4471E8FFFDA00356232 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 5E0FE4481E8FFFDA00356232 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; 5E0FE44E1E8FFFDA00356232 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 5E0FE44F1E8FFFDA00356232 /* en */, ); name = Main.storyboard; sourceTree = ""; }; 5E0FE4C71E8FFFDA00356232 /* tab_gist@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4C81E8FFFDA00356232 /* en */, 5E0FE4FC1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_gist@2x.png"; sourceTree = ""; }; 5E0FE4C91E8FFFDA00356232 /* tab_gist_sel@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4CA1E8FFFDA00356232 /* en */, 5E0FE4FD1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_gist_sel@2x.png"; sourceTree = ""; }; 5E0FE4CC1E8FFFDA00356232 /* tab_hot@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4CD1E8FFFDA00356232 /* en */, 5E0FE4EC1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_hot@2x.png"; sourceTree = ""; }; 5E0FE4CE1E8FFFDA00356232 /* tab_hot@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4CF1E8FFFDA00356232 /* en */, 5E0FE4ED1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_hot@3x.png"; sourceTree = ""; }; 5E0FE4D01E8FFFDA00356232 /* tab_hot_sel@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4D11E8FFFDA00356232 /* en */, 5E0FE4EE1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_hot_sel@2x.png"; sourceTree = ""; }; 5E0FE4D21E8FFFDA00356232 /* tab_hot_sel@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4D31E8FFFDA00356232 /* en */, 5E0FE4EF1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_hot_sel@3x.png"; sourceTree = ""; }; 5E0FE4D41E8FFFDA00356232 /* tab_me@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4D51E8FFFDA00356232 /* en */, 5E0FE4F01E8FFFDA00356232 /* zh-Hans */, ); name = "tab_me@2x.png"; sourceTree = ""; }; 5E0FE4D61E8FFFDA00356232 /* tab_me@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4D71E8FFFDA00356232 /* en */, 5E0FE4F11E8FFFDA00356232 /* zh-Hans */, ); name = "tab_me@3x.png"; sourceTree = ""; }; 5E0FE4D81E8FFFDA00356232 /* tab_me_sel@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4D91E8FFFDA00356232 /* en */, 5E0FE4F21E8FFFDA00356232 /* zh-Hans */, ); name = "tab_me_sel@2x.png"; sourceTree = ""; }; 5E0FE4DA1E8FFFDA00356232 /* tab_me_sel@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4DB1E8FFFDA00356232 /* en */, 5E0FE4F31E8FFFDA00356232 /* zh-Hans */, ); name = "tab_me_sel@3x.png"; sourceTree = ""; }; 5E0FE4DC1E8FFFDA00356232 /* tab_mes@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4DD1E8FFFDA00356232 /* en */, 5E0FE4F41E8FFFDA00356232 /* zh-Hans */, ); name = "tab_mes@2x.png"; sourceTree = ""; }; 5E0FE4DE1E8FFFDA00356232 /* tab_mes@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4DF1E8FFFDA00356232 /* en */, 5E0FE4F51E8FFFDA00356232 /* zh-Hans */, ); name = "tab_mes@3x.png"; sourceTree = ""; }; 5E0FE4E01E8FFFDA00356232 /* tab_mes_sel@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4E11E8FFFDA00356232 /* en */, 5E0FE4F61E8FFFDA00356232 /* zh-Hans */, ); name = "tab_mes_sel@2x.png"; sourceTree = ""; }; 5E0FE4E21E8FFFDA00356232 /* tab_mes_sel@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4E31E8FFFDA00356232 /* en */, 5E0FE4F71E8FFFDA00356232 /* zh-Hans */, ); name = "tab_mes_sel@3x.png"; sourceTree = ""; }; 5E0FE4E41E8FFFDA00356232 /* tab_star@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4E51E8FFFDA00356232 /* en */, 5E0FE4F81E8FFFDA00356232 /* zh-Hans */, ); name = "tab_star@2x.png"; sourceTree = ""; }; 5E0FE4E61E8FFFDA00356232 /* tab_star@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4E71E8FFFDA00356232 /* en */, 5E0FE4F91E8FFFDA00356232 /* zh-Hans */, ); name = "tab_star@3x.png"; sourceTree = ""; }; 5E0FE4E81E8FFFDA00356232 /* tab_star_sel@2x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4E91E8FFFDA00356232 /* en */, 5E0FE4FA1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_star_sel@2x.png"; sourceTree = ""; }; 5E0FE4EA1E8FFFDA00356232 /* tab_star_sel@3x.png */ = { isa = PBXVariantGroup; children = ( 5E0FE4EB1E8FFFDA00356232 /* en */, 5E0FE4FB1E8FFFDA00356232 /* zh-Hans */, ); name = "tab_star_sel@3x.png"; sourceTree = ""; }; 5E0FE4FF1E8FFFDA00356232 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 5E0FE5001E8FFFDA00356232 /* en */, 5E0FE5011E8FFFDA00356232 /* zh-Hans */, ); name = Localizable.strings; sourceTree = ""; }; 5E0FE5031E8FFFDA00356232 /* BFAbout.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE5041E8FFFDA00356232 /* en */, 5E0FE5111E8FFFDA00356232 /* zh-Hans */, ); name = BFAbout.plist; sourceTree = ""; }; 5E0FE5071E8FFFDA00356232 /* CPCity.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE5081E8FFFDA00356232 /* en */, 5E0FE5131E8FFFDA00356232 /* zh-Hans */, ); name = CPCity.plist; sourceTree = ""; }; 5E0FE5091E8FFFDA00356232 /* CPCountry.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE50A1E8FFFDA00356232 /* en */, 5E0FE5141E8FFFDA00356232 /* zh-Hans */, ); name = CPCountry.plist; sourceTree = ""; }; 5E0FE50B1E8FFFDA00356232 /* CPFilterLanguage.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE50C1E8FFFDA00356232 /* en */, 5E6116AF1F0E25560030EBF0 /* zh-Hans */, ); name = CPFilterLanguage.plist; sourceTree = ""; }; 5E0FE50D1E8FFFDA00356232 /* BFProfile.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE50E1E8FFFDA00356232 /* en */, 5E0FE5161E8FFFDA00356232 /* zh-Hans */, ); name = BFProfile.plist; sourceTree = ""; }; 5E0FE50F1E8FFFDA00356232 /* BFSetting.plist */ = { isa = PBXVariantGroup; children = ( 5E0FE5101E8FFFDA00356232 /* en */, 5E0FE5171E8FFFDA00356232 /* zh-Hans */, ); name = BFSetting.plist; sourceTree = ""; }; 5E0FE5C61E8FFFDB00356232 /* LaunchScreen.strings */ = { isa = PBXVariantGroup; children = ( 5E0FE5C71E8FFFDB00356232 /* zh-Hans */, ); name = LaunchScreen.strings; sourceTree = ""; }; 5EB55D0F1F6187A700D6CB25 /* BFPopularLanguage.plist */ = { isa = PBXVariantGroup; children = ( 5EB55D0E1F6187A700D6CB25 /* en */, 5EB55D101F6187A900D6CB25 /* zh-Hans */, ); name = BFPopularLanguage.plist; sourceTree = ""; }; 5EBEC3F720D9446F00ABDD4D /* BFRepoSync.plist */ = { isa = PBXVariantGroup; children = ( 5EBEC3F620D9446F00ABDD4D /* en */, 5EBEC3F820D9447100ABDD4D /* zh-Hans */, ); name = BFRepoSync.plist; sourceTree = ""; }; 5EDCB1231F14EA0200DC844D /* BFLanguage.plist */ = { isa = PBXVariantGroup; children = ( 5EDCB1221F14EA0200DC844D /* en */, 5EDCB1241F14EA0300DC844D /* zh-Hans */, ); name = BFLanguage.plist; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 5EC149991E828F71002039C2 /* Achoc */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Achoc; }; 5EC1499A1E828F71002039C2 /* Achoc */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5EC1499D1E828F90002039C2 /* Adhoc.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BeeFun/BeeFun.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty", ); INFOPLIST_FILE = BeeFun/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; IPHONEOS_DEPLOYMENT_TARGET = 18.0; LD_GENERATE_MAP_FILE = YES; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", ); PRODUCT_BUNDLE_IDENTIFIER = com.luci.beefun.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_ACTIVE_COMPILATION_CONDITIONS = BETA; SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_OBJC_BRIDGING_HEADER = "BeeFun/BeeFun-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Achoc; }; FEC0DC5E1C28B39F0008C7C1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; FEC0DC5F1C28B39F0008C7C1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = Release; }; FEC0DC611C28B39F0008C7C1 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5E87F6B51E820407001608F1 /* Debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BeeFun/BeeFun.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/build/Debug-iphoneos", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/Required", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/Required", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/Optional", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK", "$(PROJECT_DIR)/BeeFun/ThidParty", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty", ); INFOPLIST_FILE = BeeFun/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; IPHONEOS_DEPLOYMENT_TARGET = 18.0; LD_GENERATE_MAP_FILE = YES; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", ); PRODUCT_BUNDLE_IDENTIFIER = com.luci.beefun.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_OBJC_BRIDGING_HEADER = "BeeFun/BeeFun-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; FEC0DC621C28B39F0008C7C1 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 5E87F6B61E820407001608F1 /* Release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BeeFun/BeeFun.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 69XHTLCF36; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/build/Debug-iphoneos", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/Required", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/Required", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/Optional", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK", "$(PROJECT_DIR)/BeeFun/ThidParty", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Optional", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformConnector", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/QQSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/Required", "$(PROJECT_DIR)/BeeFun/ThirdParty", ); INFOPLIST_FILE = BeeFun/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; IPHONEOS_DEPLOYMENT_TARGET = 18.0; LD_GENERATE_MAP_FILE = YES; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", "$(PROJECT_DIR)/BeeFun/ThidParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/SinaWeiboSDK", "$(PROJECT_DIR)/BeeFun/ThirdParty/MobSDK/ShareSDK/Support/PlatformSDK/WeChatSDK", ); PRODUCT_BUNDLE_IDENTIFIER = com.luci.beefun.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_ACTIVE_COMPILATION_CONDITIONS = Release; SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_OBJC_BRIDGING_HEADER = "BeeFun/BeeFun-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ FEC0DC311C28B39F0008C7C1 /* Build configuration list for PBXProject "BeeFun" */ = { isa = XCConfigurationList; buildConfigurations = ( FEC0DC5E1C28B39F0008C7C1 /* Debug */, 5EC149991E828F71002039C2 /* Achoc */, FEC0DC5F1C28B39F0008C7C1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; FEC0DC601C28B39F0008C7C1 /* Build configuration list for PBXNativeTarget "BeeFun" */ = { isa = XCConfigurationList; buildConfigurations = ( FEC0DC611C28B39F0008C7C1 /* Debug */, 5EC1499A1E828F71002039C2 /* Achoc */, FEC0DC621C28B39F0008C7C1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = FEC0DC2E1C28B39F0008C7C1 /* Project object */; } ================================================ FILE: BeeFun/BeeFun.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: BeeFun/BeeFun.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: BeeFun/BeeFun.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: BeeFun/BeeFun.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: BeeFun/Podfile ================================================ platform :ios, '18.0' # ignore all warnings from all pods inhibit_all_warnings! target 'BeeFun' do use_frameworks! # pod 'Zip' pod 'Alamofire' pod 'IQKeyboardManagerSwift' pod 'SnapKit' pod 'Moya' pod 'ObjectMapper' pod 'Kingfisher' pod 'MBProgressHUD' # pod 'SVProgressHUD' pod 'HMSegmentedControl' pod 'SwiftyJSON' pod 'SwiftyBeaver' pod 'MJRefresh' # pod 'iCloudDocumentSync' pod 'SwiftDate' # pod 'Bugly' # pod 'PromiseKit', '~> 4.0' pod 'SwiftMessages' pod 'JPush' # pod 'AVOSCloud' pod 'TOWebViewController' # Fabric 服务 pod 'Fabric' pod 'Crashlytics' pod 'SwiftLint' pod 'SQLite.swift' pod 'iCarousel' pod 'SwipeCellKit' pod 'ReachabilitySwift' pod "Kanna" # pod 'Reveal-SDK', :configurations => ['Debug'] # pod 'GodEye', '~> 1.0.0', :configurations => ['Debug'] 现在该库不能使用,待更新后再重启该库 # pod 'GDPerformanceView-Swift', '~> 1.3.2', :configurations => ['Debug'] pod 'YYText' pod 'OAuthSwift' pod 'SwiftyStoreKit' # pod 'RxSwift' # pod 'RxCocoa' pod 'SkeletonView' end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' config.build_settings['SWIFT_VERSION'] = '5.0' config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' # Xcode 16+ explicit module mode may fail on some legacy pods (e.g. Kanna/libxmlKanna). config.build_settings['SWIFT_ENABLE_EXPLICIT_MODULES'] = 'NO' end end installer.aggregate_targets.each do |aggregate_target| aggregate_target.user_project.native_targets.each do |native_target| native_target.build_configurations.each do |config| config.build_settings['SWIFT_ENABLE_EXPLICIT_MODULES'] = 'NO' end end aggregate_target.user_project.save end end ================================================ FILE: BeeFun/XcodeConfig/Adhoc.xcconfig ================================================ // // Config.xcconfig // BeeFun // // Created by WengHengcong on 2017/3/21. // Copyright © 2017年 JungleSong. All rights reserved. // #include "Common.xcconfig" #include "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.achoc.xcconfig" APP_DISPLAYNAME = BeeFun for iOS VERSION_NUM = 0.9 BUILD_NUM = 100 ================================================ FILE: BeeFun/XcodeConfig/Common.xcconfig ================================================ // // Config.xcconfig // BeeFun // // Created by WengHengcong on 2017/3/21. // Copyright © 2017年 JungleSong. All rights reserved. // VERSION_NUM = 1.0 BUILD_NUM = 1000 ================================================ FILE: BeeFun/XcodeConfig/Debug.xcconfig ================================================ // // Config.xcconfig // BeeFun // // Created by WengHengcong on 2017/3/21. // Copyright © 2017年 JungleSong. All rights reserved. // #include "Common.xcconfig" #include "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.debug.xcconfig" APP_DISPLAYNAME = BeeFun Adhoc VERSION_NUM = 0.9 BUILD_NUM = 101 ================================================ FILE: BeeFun/XcodeConfig/Release.xcconfig ================================================ // // Config.xcconfig // BeeFun // // Created by WengHengcong on 2017/3/21. // Copyright © 2017年 JungleSong. All rights reserved. // #include "Common.xcconfig" #include "Pods/Target Support Files/Pods-BeeFun/Pods-BeeFun.release.xcconfig" APP_DISPLAYNAME = BeeFun for iOS VERSION_NUM = 1.0 BUILD_NUM = 1000 ================================================ FILE: BeeFun/fastlane/Appfile ================================================ app_identifier "com.junglesong.coderpursue" # The bundle identifier of your app apple_id "wenghengcong@icloud.com" # Your Apple email address team_id "69XHTLCF36" # Developer Portal Team ID # you can even provide different app identifiers, Apple IDs and team names per lane: # More information: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Appfile.md #有开发和正式版的区别 #app_identifier "tools.fastlane.app" # The bundle identifier of your app #apple_dev_portal_id "portal@company.com" # Apple Developer Account #itunes_connect_id "tunes@company.com" # iTunes Connect Account #team_id "Q2CBPJ58CA" # Developer Portal Team ID #itc_team_id "18742801" # iTunes Connect Team ID #有不同环境下的区别 #You only have to use for_platform if you're using platform [platform_name] do in #your Fastfile. #app_identifier "net.sunapps.1" #apple_id "felix@krausefx.com" #team_id "Q2CBPJ58CC" #for_platform :ios do # team_id '123' # for all iOS related things # for_lane :test do # app_identifier 'com.app.test' # end #end ================================================ FILE: BeeFun/fastlane/Deliverfile ================================================ ###################### More Options ###################### # If you want to have even more control, check out the documentation # https://github.com/fastlane/fastlane/blob/master/deliver/Deliverfile.md ###################### Automatically generated ###################### # Feel free to remove the following line if you use fastlane (which you should) app_identifier "com.junglesong.coderpursue" # The bundle identifier of your app username "wenghengcong@icloud.com" # your Apple ID user ================================================ FILE: BeeFun/fastlane/Fastfile ================================================ # Customise this file, documentation can be found here: # https://github.com/fastlane/fastlane/tree/master/fastlane/docs # All available actions: https://docs.fastlane.tools/actions # can also be listed using the `fastlane actions` command # Change the syntax highlighting to Ruby # All lines starting with a # are ignored when running `fastlane` # If you want to automatically update fastlane if a new version is available: # update_fastlane # This is the minimum version number required. # Update this, if you use features of a newer version fastlane_version "2.19.3" default_platform :ios platform :ios do before_all do # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..." cocoapods end desc "Runs all the tests" lane :test do scan end desc "Submit a new Beta Build to Apple TestFlight" desc "This will also make sure the profile is up to date" lane :beta do # match(type: "appstore") # more information: https://codesigning.guide gym(scheme: "Coderpursue") # Build your app - more options available #pilot #testflight # sh "your_script.sh" # You can also use other beta testing services here (run `fastlane actions`) end desc "Deploy a new version to the App Store" lane :release do # match(type: "appstore") # snapshot gym(scheme: "Coderpursue") # Build your app - more options available deliver(force: true) # frameit end # You can define as many lanes as you want after_all do |lane| # This block is called, only if the executed lane was successful # slack( # message: "Successfully deployed new App Update." # ) end error do |lane, exception| # slack( # message: exception.message, # success: false # ) end end # More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md # All available actions: https://docs.fastlane.tools/actions # fastlane reports which actions are used # No personal data is recorded. Learn more at https://github.com/fastlane/enhancer ================================================ FILE: BeeFun/fastlane/Gymfile ================================================ output_directory "~/Desktop/Coderpursue/" # In general, you can use the options available # gym --help # Remove the # in front of the line to enable the option # scheme "Example" # sdk "iphoneos9.0" #output_name "MyApp" # the name of the ipa file #configuration #The configuration to use when building the app. Defaults to 'Release' #codesigning_identity #The name of the code signing identity to use. It has to match the name exactly. e.g. 'iPhone Distribution: SunApps GmbH' #provisioning_profile_path true# [DEPRECATED!] Use target specific provisioning profiles instead - The path to the provisioning profile (optional) #export_options( # method: "ad-hoc", # manifest: { # appURL: "https://example.com/My App.ipa", # }, # thinning: "" #) # For more information about this configuration visit # https://github.com/fastlane/gym#gymfile ================================================ FILE: BeeFun/fastlane/Matchfile ================================================ git_url "git@github.com:wenghengcong/CPConfiguration.git" type "development" # The default type, can be: appstore, adhoc or development force_for_new_devices true #Renew the provisioning profiles if the device count on the developer portal has changed #git_branch # app_identifier ["tools.fastlane.app", "tools.fastlane.app2"] # username "user@fastlane.tools" # Your Apple Developer Portal username #readonly #Only fetch existing certificates and profiles, don't generate new ones #team_id #The ID of your Developer Portal team if you're in multiple teams #team_name #The name of your Developer Portal team if you're in multiple teams #force # Renew the provisioning profiles every time you run match #skip_confirmation #Disables confirmation prompts during nuke, answering them with yes #platform #Set the provisioning profile's platform to work with (i.e. ios, tvos) # For all available options run `fastlane match --help` # Remove the # in the beginning of the line to enable the other options ================================================ FILE: BeeFun/fastlane/README.md ================================================ fastlane documentation ================ # Installation Make sure you have the latest version of the Xcode command line tools installed: ``` xcode-select --install ``` ## Choose your installation method:
Homebrew Installer Script Rubygems
macOS macOS macOS or Linux with Ruby 2.0.0 or above
brew cask install fastlane Download the zip file. Then double click on the install script (or run it in a terminal window). sudo gem install fastlane -NV
# Available Actions ## iOS ### ios test ``` fastlane ios test ``` Runs all the tests ### ios beta ``` fastlane ios beta ``` Submit a new Beta Build to Apple TestFlight This will also make sure the profile is up to date ### ios release ``` fastlane ios release ``` Deploy a new version to the App Store ---- This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). ================================================ FILE: BeeFun/fastlane/metadata/copyright.txt ================================================ wenghengcong ================================================ FILE: BeeFun/fastlane/metadata/en-US/description.txt ================================================ Coderpursue is an open source swift client of github. Features: >Search repository and user. >Explore Github: find interesting repositories and developers. >Browser your notifications and events. >Follow/UnFollow someone. >Star/Watch/Fork repository. >Share repository or user to Weibo and Facebook. ================================================ FILE: BeeFun/fastlane/metadata/en-US/keywords.txt ================================================ code,coder,github,git,repository,developer,programmer,tool,design ================================================ FILE: BeeFun/fastlane/metadata/en-US/marketing_url.txt ================================================ https://github.com/wenghengcong/Coderpursue ================================================ FILE: BeeFun/fastlane/metadata/en-US/name.txt ================================================ Coderpursue ================================================ FILE: BeeFun/fastlane/metadata/en-US/privacy_url.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/en-US/release_notes.txt ================================================ 1.redesign repository view; 2.fix repository created time disappear error. ================================================ FILE: BeeFun/fastlane/metadata/en-US/support_url.txt ================================================ https://github.com/wenghengcong/Coderpursue ================================================ FILE: BeeFun/fastlane/metadata/primary_category.txt ================================================ MZGenre.Productivity ================================================ FILE: BeeFun/fastlane/metadata/primary_first_sub_category.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/primary_second_sub_category.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/review_information/demo_password.txt ================================================ test1234 ================================================ FILE: BeeFun/fastlane/metadata/review_information/demo_user.txt ================================================ junglesong ================================================ FILE: BeeFun/fastlane/metadata/review_information/email_address.txt ================================================ wenghengcong@icloud.com ================================================ FILE: BeeFun/fastlane/metadata/review_information/first_name.txt ================================================ Hengcong ================================================ FILE: BeeFun/fastlane/metadata/review_information/last_name.txt ================================================ Weng ================================================ FILE: BeeFun/fastlane/metadata/review_information/notes.txt ================================================ Demo Account is github.com account. Thanks. ================================================ FILE: BeeFun/fastlane/metadata/review_information/phone_number.txt ================================================ +8618770088008 ================================================ FILE: BeeFun/fastlane/metadata/secondary_category.txt ================================================ MZGenre.SocialNetworking ================================================ FILE: BeeFun/fastlane/metadata/secondary_first_sub_category.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/secondary_second_sub_category.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/description.txt ================================================ Coderpursue github第三方客户端。 【搜索】 搜索开发者、代码库。 【发现Github上最流行的代码库】 紧跟每天、每周、每月的流行风向! 【浏览通知与事件】 关注自己参与的代码中的通知、issue和事件,不错过每个重要提醒! 【随心所欲的点击】 跟随开发者、Star仓库。 【分享】 分享你的所见所得。 持续更新,欢迎关注。 微博:极简到纯粹 邮箱:wenghengcong@icloud.com ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/keywords.txt ================================================ github,git,代码,代码仓库,分享,开源,程序员,编程,设计,软件 ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/marketing_url.txt ================================================ https://github.com/wenghengcong/Coderpursue ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/name.txt ================================================ Coderpursue ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/privacy_url.txt ================================================ ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/release_notes.txt ================================================ 1.代码仓库页重新设计; 2.修复时间不显示错误。 ================================================ FILE: BeeFun/fastlane/metadata/zh-Hans/support_url.txt ================================================ https://github.com/wenghengcong/Coderpursue ================================================ FILE: BeeFun/fastlane/report.xml ================================================ ================================================ FILE: BeeFun/fastlane/screenshots/README.txt ================================================ Put all screenshots you want to use inside the folder of its language (e.g. en-US). The device type will automatically be recognized using the image resolution. Apple TV screenshots should be stored in a subdirectory named appleTV with language folders inside of it. iMessage screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage with language folders inside of it. The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically. ================================================ FILE: BeeFun/infer-out/bugs.txt ================================================ Found 64 issues Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:267: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar showStarted of an atomic property at line 267, column 32. Accessing an ivar of an atomic property makes the property nonatomic 265. // If the minShow time is set, calculate how long the hud was shown, 266. // and pospone the hiding operation if necessary 267. > if (self.minShowTime > 0.0 && showStarted) { 268. NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; 269. if (interv < self.minShowTime) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:268: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar showStarted of an atomic property at line 268, column 64. Accessing an ivar of an atomic property makes the property nonatomic 266. // and pospone the hiding operation if necessary 267. if (self.minShowTime > 0.0 && showStarted) { 268. > NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; 269. if (interv < self.minShowTime) { 270. self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:291: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar taskInProgress of an atomic property at line 291, column 6. Accessing an ivar of an atomic property makes the property nonatomic 289. - (void)handleGraceTimer:(NSTimer *)theTimer { 290. // Show the HUD only if the task is still running 291. > if (taskInProgress) { 292. [self showUsingAnimation:useAnimation]; 293. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:313: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 313, column 18. Accessing an ivar of an atomic property makes the property nonatomic 311. [self setNeedsDisplay]; 312. 313. > if (animated && animationType == MBProgressHUDAnimationZoomIn) { 314. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); 315. } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:315: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 315, column 25. Accessing an ivar of an atomic property makes the property nonatomic 313. if (animated && animationType == MBProgressHUDAnimationZoomIn) { 314. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); 315. > } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { 316. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); 317. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:324: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 324, column 56. Accessing an ivar of an atomic property makes the property nonatomic 322. [UIView setAnimationDuration:0.30]; 323. self.alpha = 1.0f; 324. > if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { 325. self.transform = rotationTransform; 326. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:324: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 324, column 7. Accessing an ivar of an atomic property makes the property nonatomic 322. [UIView setAnimationDuration:0.30]; 323. self.alpha = 1.0f; 324. > if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { 325. self.transform = rotationTransform; 326. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:336: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar showStarted of an atomic property at line 336, column 18. Accessing an ivar of an atomic property makes the property nonatomic 334. - (void)hideUsingAnimation:(BOOL)animated { 335. // Fade out 336. > if (animated && showStarted) { 337. [UIView beginAnimations:nil context:NULL]; 338. [UIView setAnimationDuration:0.30]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:343: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 343, column 7. Accessing an ivar of an atomic property makes the property nonatomic 341. // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden 342. // in the done method 343. > if (animationType == MBProgressHUDAnimationZoomIn) { 344. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); 345. } else if (animationType == MBProgressHUDAnimationZoomOut) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:345: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar animationType of an atomic property at line 345, column 14. Accessing an ivar of an atomic property makes the property nonatomic 343. if (animationType == MBProgressHUDAnimationZoomIn) { 344. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); 345. > } else if (animationType == MBProgressHUDAnimationZoomOut) { 346. self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); 347. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:367: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar removeFromSuperViewOnHide of an atomic property at line 367, column 6. Accessing an ivar of an atomic property makes the property nonatomic 365. isFinished = YES; 366. self.alpha = 0.0f; 367. > if (removeFromSuperViewOnHide) { 368. [self removeFromSuperview]; 369. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:376: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar delegate of an atomic property at line 376, column 7. Accessing an ivar of an atomic property makes the property nonatomic 374. } 375. #endif 376. > if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { 377. [delegate performSelector:@selector(hudWasHidden:) withObject:self]; 378. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:377: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar delegate of an atomic property at line 377, column 4. Accessing an ivar of an atomic property makes the property nonatomic 375. #endif 376. if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { 377. > [delegate performSelector:@selector(hudWasHidden:) withObject:self]; 378. } 379. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:439: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar taskInProgress of an atomic property at line 439, column 2. Accessing an ivar of an atomic property makes the property nonatomic 437. 438. - (void)cleanUp { 439. > taskInProgress = NO; 440. #if !__has_feature(objc_arc) 441. [targetForExecution release]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:478: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 478, column 30. Accessing an ivar of an atomic property makes the property nonatomic 476. - (void)updateIndicators { 477. 478. > BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; 479. BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; 480. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:479: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 479, column 27. Accessing an ivar of an atomic property makes the property nonatomic 477. 478. BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; 479. > BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; 480. 481. if (mode == MBProgressHUDModeIndeterminate) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:481: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 481, column 6. Accessing an ivar of an atomic property makes the property nonatomic 479. BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; 480. 481. > if (mode == MBProgressHUDModeIndeterminate) { 482. if (!isActivityIndicator) { 483. // Update to indeterminate indicator Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:484: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 484, column 5. Accessing an ivar of an atomic property makes the property nonatomic 482. if (!isActivityIndicator) { 483. // Update to indeterminate indicator 484. > [indicator removeFromSuperview]; 485. self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] 486. initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:487: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 487, column 32. Accessing an ivar of an atomic property makes the property nonatomic 485. self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] 486. initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); 487. > [(UIActivityIndicatorView *)indicator startAnimating]; 488. [self addSubview:indicator]; 489. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:488: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 488, column 21. Accessing an ivar of an atomic property makes the property nonatomic 486. initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); 487. [(UIActivityIndicatorView *)indicator startAnimating]; 488. > [self addSubview:indicator]; 489. } 490. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:491: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 491, column 31. Accessing an ivar of an atomic property makes the property nonatomic 489. } 490. #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 491. > [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; 492. #endif 493. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:494: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 494, column 11. Accessing an ivar of an atomic property makes the property nonatomic 492. #endif 493. } 494. > else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { 495. // Update to bar determinate indicator 496. [indicator removeFromSuperview]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:496: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 496, column 4. Accessing an ivar of an atomic property makes the property nonatomic 494. else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { 495. // Update to bar determinate indicator 496. > [indicator removeFromSuperview]; 497. self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); 498. [self addSubview:indicator]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:498: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 498, column 20. Accessing an ivar of an atomic property makes the property nonatomic 496. [indicator removeFromSuperview]; 497. self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); 498. > [self addSubview:indicator]; 499. } 500. else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:500: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 500, column 51. Accessing an ivar of an atomic property makes the property nonatomic 498. [self addSubview:indicator]; 499. } 500. > else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { 501. if (!isRoundIndicator) { 502. // Update to determinante indicator Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:500: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 500, column 11. Accessing an ivar of an atomic property makes the property nonatomic 498. [self addSubview:indicator]; 499. } 500. > else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { 501. if (!isRoundIndicator) { 502. // Update to determinante indicator Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:503: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 503, column 5. Accessing an ivar of an atomic property makes the property nonatomic 501. if (!isRoundIndicator) { 502. // Update to determinante indicator 503. > [indicator removeFromSuperview]; 504. self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); 505. [self addSubview:indicator]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:505: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 505, column 21. Accessing an ivar of an atomic property makes the property nonatomic 503. [indicator removeFromSuperview]; 504. self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); 505. > [self addSubview:indicator]; 506. } 507. if (mode == MBProgressHUDModeAnnularDeterminate) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:507: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 507, column 7. Accessing an ivar of an atomic property makes the property nonatomic 505. [self addSubview:indicator]; 506. } 507. > if (mode == MBProgressHUDModeAnnularDeterminate) { 508. [(MBRoundProgressView *)indicator setAnnular:YES]; 509. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:508: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 508, column 28. Accessing an ivar of an atomic property makes the property nonatomic 506. } 507. if (mode == MBProgressHUDModeAnnularDeterminate) { 508. > [(MBRoundProgressView *)indicator setAnnular:YES]; 509. } 510. [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:510: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 510, column 27. Accessing an ivar of an atomic property makes the property nonatomic 508. [(MBRoundProgressView *)indicator setAnnular:YES]; 509. } 510. > [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; 511. [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; 512. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:511: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 511, column 27. Accessing an ivar of an atomic property makes the property nonatomic 509. } 510. [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; 511. > [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; 512. } 513. else if (mode == MBProgressHUDModeCustomView && customView != indicator) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:513: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 513, column 11. Accessing an ivar of an atomic property makes the property nonatomic 511. [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; 512. } 513. > else if (mode == MBProgressHUDModeCustomView && customView != indicator) { 514. // Update custom view indicator 515. [indicator removeFromSuperview]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:513: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar customView of an atomic property at line 513, column 50. Accessing an ivar of an atomic property makes the property nonatomic 511. [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; 512. } 513. > else if (mode == MBProgressHUDModeCustomView && customView != indicator) { 514. // Update custom view indicator 515. [indicator removeFromSuperview]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:513: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 513, column 64. Accessing an ivar of an atomic property makes the property nonatomic 511. [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; 512. } 513. > else if (mode == MBProgressHUDModeCustomView && customView != indicator) { 514. // Update custom view indicator 515. [indicator removeFromSuperview]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:515: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 515, column 4. Accessing an ivar of an atomic property makes the property nonatomic 513. else if (mode == MBProgressHUDModeCustomView && customView != indicator) { 514. // Update custom view indicator 515. > [indicator removeFromSuperview]; 516. self.indicator = customView; 517. [self addSubview:indicator]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:516: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar customView of an atomic property at line 516, column 20. Accessing an ivar of an atomic property makes the property nonatomic 514. // Update custom view indicator 515. [indicator removeFromSuperview]; 516. > self.indicator = customView; 517. [self addSubview:indicator]; 518. } else if (mode == MBProgressHUDModeText) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:517: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 517, column 20. Accessing an ivar of an atomic property makes the property nonatomic 515. [indicator removeFromSuperview]; 516. self.indicator = customView; 517. > [self addSubview:indicator]; 518. } else if (mode == MBProgressHUDModeText) { 519. [indicator removeFromSuperview]; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:518: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar mode of an atomic property at line 518, column 13. Accessing an ivar of an atomic property makes the property nonatomic 516. self.indicator = customView; 517. [self addSubview:indicator]; 518. > } else if (mode == MBProgressHUDModeText) { 519. [indicator removeFromSuperview]; 520. self.indicator = nil; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:519: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 519, column 4. Accessing an ivar of an atomic property makes the property nonatomic 517. [self addSubview:indicator]; 518. } else if (mode == MBProgressHUDModeText) { 519. > [indicator removeFromSuperview]; 520. self.indicator = nil; 521. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:537: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 537, column 45. Accessing an ivar of an atomic property makes the property nonatomic 535. 536. // Determine the total width and height needed 537. > CGFloat maxWidth = bounds.size.width - 4 * margin; 538. CGSize totalSize = CGSizeZero; 539. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:540: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 540, column 22. Accessing an ivar of an atomic property makes the property nonatomic 538. CGSize totalSize = CGSizeZero; 539. 540. > CGRect indicatorF = indicator.bounds; 541. indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); 542. totalSize.width = MAX(totalSize.width, indicatorF.size.width); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:553: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 553, column 83. Accessing an ivar of an atomic property makes the property nonatomic 551. } 552. 553. > CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; 554. CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); 555. CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:562: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 562, column 25. Accessing an ivar of an atomic property makes the property nonatomic 560. } 561. 562. > totalSize.width += 2 * margin; 563. totalSize.height += 2 * margin; 564. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:563: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 563, column 26. Accessing an ivar of an atomic property makes the property nonatomic 561. 562. totalSize.width += 2 * margin; 563. > totalSize.height += 2 * margin; 564. 565. // Position elements Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:566: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar yOffset of an atomic property at line 566, column 81. Accessing an ivar of an atomic property makes the property nonatomic 564. 565. // Position elements 566. > CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; 567. CGFloat xPos = xOffset; 568. indicatorF.origin.y = yPos; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:566: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 566, column 72. Accessing an ivar of an atomic property makes the property nonatomic 564. 565. // Position elements 566. > CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; 567. CGFloat xPos = xOffset; 568. indicatorF.origin.y = yPos; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:567: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar xOffset of an atomic property at line 567, column 17. Accessing an ivar of an atomic property makes the property nonatomic 565. // Position elements 566. CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; 567. > CGFloat xPos = xOffset; 568. indicatorF.origin.y = yPos; 569. indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:570: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 570, column 2. Accessing an ivar of an atomic property makes the property nonatomic 568. indicatorF.origin.y = yPos; 569. indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; 570. > indicator.frame = indicatorF; 571. yPos += indicatorF.size.height; 572. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:593: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar square of an atomic property at line 593, column 6. Accessing an ivar of an atomic property makes the property nonatomic 591. 592. // Enforce minsize and quare rules 593. > if (square) { 594. CGFloat max = MAX(totalSize.width, totalSize.height); 595. if (max <= bounds.size.width - 2 * margin) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:595: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 595, column 38. Accessing an ivar of an atomic property makes the property nonatomic 593. if (square) { 594. CGFloat max = MAX(totalSize.width, totalSize.height); 595. > if (max <= bounds.size.width - 2 * margin) { 596. totalSize.width = max; 597. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:598: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar margin of an atomic property at line 598, column 39. Accessing an ivar of an atomic property makes the property nonatomic 596. totalSize.width = max; 597. } 598. > if (max <= bounds.size.height - 2 * margin) { 599. totalSize.height = max; 600. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:602: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar minSize of an atomic property at line 602, column 24. Accessing an ivar of an atomic property makes the property nonatomic 600. } 601. } 602. > if (totalSize.width < minSize.width) { 603. totalSize.width = minSize.width; 604. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:603: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar minSize of an atomic property at line 603, column 21. Accessing an ivar of an atomic property makes the property nonatomic 601. } 602. if (totalSize.width < minSize.width) { 603. > totalSize.width = minSize.width; 604. } 605. if (totalSize.height < minSize.height) { Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:605: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar minSize of an atomic property at line 605, column 25. Accessing an ivar of an atomic property makes the property nonatomic 603. totalSize.width = minSize.width; 604. } 605. > if (totalSize.height < minSize.height) { 606. totalSize.height = minSize.height; 607. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:606: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar minSize of an atomic property at line 606, column 22. Accessing an ivar of an atomic property makes the property nonatomic 604. } 605. if (totalSize.height < minSize.height) { 606. > totalSize.height = minSize.height; 607. } 608. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:609: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar size of an atomic property at line 609, column 2. Accessing an ivar of an atomic property makes the property nonatomic 607. } 608. 609. > size = totalSize; 610. } 611. Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:649: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar size of an atomic property at line 649, column 30. Accessing an ivar of an atomic property makes the property nonatomic 647. CGRect allRect = self.bounds; 648. // Draw rounded HUD backgroud rect 649. > CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, 650. round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); 651. float radius = self.cornerRadius; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:650: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar size of an atomic property at line 650, column 72. Accessing an ivar of an atomic property makes the property nonatomic 648. // Draw rounded HUD backgroud rect 649. CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, 650. > round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); 651. float radius = self.cornerRadius; 652. CGContextBeginPath(context); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:650: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar size of an atomic property at line 650, column 9. Accessing an ivar of an atomic property makes the property nonatomic 648. // Draw rounded HUD backgroud rect 649. CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, 650. > round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); 651. float radius = self.cornerRadius; 652. CGContextBeginPath(context); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:650: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar size of an atomic property at line 650, column 84. Accessing an ivar of an atomic property makes the property nonatomic 648. // Draw rounded HUD backgroud rect 649. CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, 650. > round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); 651. float radius = self.cornerRadius; 652. CGContextBeginPath(context); Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:708: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 708, column 8. Accessing an ivar of an atomic property makes the property nonatomic 706. detailsLabel.textColor = self.detailsLabelColor; 707. } else if ([keyPath isEqualToString:@"progress"]) { 708. > if ([indicator respondsToSelector:@selector(setProgress:)]) { 709. [(id)indicator setValue:@(progress) forKey:@"progress"]; 710. } Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:709: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar indicator of an atomic property at line 709, column 9. Accessing an ivar of an atomic property makes the property nonatomic 707. } else if ([keyPath isEqualToString:@"progress"]) { 708. if ([indicator respondsToSelector:@selector(setProgress:)]) { 709. > [(id)indicator setValue:@(progress) forKey:@"progress"]; 710. } 711. return; Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m:709: warning: DIRECT_ATOMIC_PROPERTY_ACCESS Direct access to ivar progress of an atomic property at line 709, column 30. Accessing an ivar of an atomic property makes the property nonatomic 707. } else if ([keyPath isEqualToString:@"progress"]) { 708. if ([indicator respondsToSelector:@selector(setProgress:)]) { 709. > [(id)indicator setValue:@(progress) forKey:@"progress"]; 710. } 711. return; Summary of the reports: DIRECT_ATOMIC_PROPERTY_ACCESS: 64 ================================================ FILE: BeeFun/infer-out/multicore/Makefile ================================================ INFERANALYZE= /usr/local/Cellar/infer/0.7.0/libexec/infer/lib/python/inferlib/../../../bin/InferAnalyze $(INFER_OPTIONS) -results_dir '/Users/wenghengcong/Github/Coderpursue/Coderpursue/infer-out' OBJECTS=cl1 cl2 cl3 cl4 cl5 cl6 cl7 cl8 cl9 cl10 cl11 cl12 cl13 cl14 cl15 cl16 cl17 cl18 cl19 default: test all: test test: $(OBJECTS) echo "" cl1 : $(INFERANALYZE) -cluster xcl1.cluster >cl1 cl2 : $(INFERANALYZE) -cluster xcl2.cluster >cl2 cl3 : $(INFERANALYZE) -cluster xcl3.cluster >cl3 cl4 : $(INFERANALYZE) -cluster xcl4.cluster >cl4 cl5 : $(INFERANALYZE) -cluster xcl5.cluster >cl5 cl6 : cl5 $(INFERANALYZE) -cluster xcl6.cluster >cl6 cl7 : cl3 cl5 cl6 $(INFERANALYZE) -cluster xcl7.cluster >cl7 cl8 : cl4 cl5 cl6 $(INFERANALYZE) -cluster xcl8.cluster >cl8 cl9 : cl3 cl4 cl5 cl6 cl8 $(INFERANALYZE) -cluster xcl9.cluster >cl9 cl10 : cl3 cl5 cl6 $(INFERANALYZE) -cluster xcl10.cluster >cl10 cl11 : cl5 cl6 $(INFERANALYZE) -cluster xcl11.cluster >cl11 cl12 : cl5 cl6 $(INFERANALYZE) -cluster xcl12.cluster >cl12 cl13 : cl6 $(INFERANALYZE) -cluster xcl13.cluster >cl13 cl14 : cl6 $(INFERANALYZE) -cluster xcl14.cluster >cl14 cl15 : cl5 cl6 cl14 $(INFERANALYZE) -cluster xcl15.cluster >cl15 cl16 : cl5 cl6 cl14 $(INFERANALYZE) -cluster xcl16.cluster >cl16 cl17 : cl5 cl6 $(INFERANALYZE) -cluster xcl17.cluster >cl17 cl18 : cl5 cl6 cl17 $(INFERANALYZE) -cluster xcl18.cluster >cl18 cl19 : cl5 cl6 cl17 $(INFERANALYZE) -cluster xcl19.cluster >cl19 clean: rm -f $(OBJECTS) ================================================ FILE: BeeFun/infer-out/multicore/cl1 ================================================ Cluster xcl1.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl10 ================================================ Cluster xcl10.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl11 ================================================ Cluster xcl11.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl12 ================================================ Cluster xcl12.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl13 ================================================ Cluster xcl13.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl14 ================================================ Cluster xcl14.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl15 ================================================ Cluster xcl15.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl16 ================================================ Cluster xcl16.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl17 ================================================ Cluster xcl17.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl18 ================================================ Cluster xcl18.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl19 ================================================ Cluster xcl19.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl2 ================================================ Cluster xcl2.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl3 ================================================ Cluster xcl3.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl4 ================================================ Cluster xcl4.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl5 ================================================ Cluster xcl5.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl6 ================================================ Cluster xcl6.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl7 ================================================ Cluster xcl7.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl8 ================================================ Cluster xcl8.cluster ================================================ FILE: BeeFun/infer-out/multicore/cl9 ================================================ Cluster xcl9.cluster ================================================ FILE: BeeFun/infer-out/proc_stats.json ================================================ { "files": 19, "procedures": 286, "lines": 1920 } ================================================ FILE: BeeFun/infer-out/procs.csv ================================================ name,name_id,specs,time,to,symop,err,file,line,loc,top,signature,weight,proof_coverage,rank,in_calls,out_calls,proof_trace "HMScrollView_touchesBegan:withEvent:","HMScrollView_touchesBegan:withEvent:{instance}.d59f2b4a0fda4ec48b036513c8dd8cc9",0,0,NONE,6,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,29,887,N,"void HMScrollView_touchesBegan:withEvent:(class HMScrollView *self, class NSSet *touches, class UIEvent *event)",14,0.00,0.60,0,3,,"HMScrollView_touchesEnded:withEvent:","HMScrollView_touchesEnded:withEvent:{instance}.8f3c38acc9d5dc615c13261818676983",0,0,NONE,6,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,45,887,N,"void HMScrollView_touchesEnded:withEvent:(class HMScrollView *self, class NSSet *touches, class UIEvent *event)",14,0.00,0.60,0,3,,"HMScrollView_touchesMoved:withEvent:","HMScrollView_touchesMoved:withEvent:{instance}.c1670bac25a0a202b52dda692c907230",0,0,NONE,6,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,37,887,N,"void HMScrollView_touchesMoved:withEvent:(class HMScrollView *self, class NSSet *touches, class UIEvent *event)",14,0.00,0.60,0,3,,"HMSegmentedControl_addBackgroundAndBorderLayerWithRect:","HMSegmentedControl_addBackgroundAndBorderLayerWithRect:{instance}.7dd0377b1da0e5b410137e62fdec2030",0,0,NONE,13,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,466,887,N,"void HMSegmentedControl_addBackgroundAndBorderLayerWithRect:(class HMSegmentedControl *self, struct CGRect fullRect)",37,0.00,1.23,4,12,,"HMSegmentedControl_attributedTitleAtIndex:","HMSegmentedControl_attributedTitleAtIndex:{instance}.a5b762b44c0d812624d2256563840cc5",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,237,887,N,"class NSAttributedString *HMSegmentedControl_attributedTitleAtIndex:(class HMSegmentedControl *self, unsigned long index)",39,0.00,1.36,3,19,,"HMSegmentedControl_awakeFromNib","HMSegmentedControl_awakeFromNib{instance}.f3fa814debe72a72b9e0eb7ccf2e15a5",1,0,NONE,28,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,119,887,N,"void HMSegmentedControl_awakeFromNib(class HMSegmentedControl *self)",5,1.00,2.07,0,116,119 120 122 123 124,"HMSegmentedControl_commonInit","HMSegmentedControl_commonInit{instance}.38533cdade2a6665dabfbf9b34dfee27",0,0,NONE,10,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,126,887,N,"void HMSegmentedControl_commonInit(class HMSegmentedControl *self)",33,0.00,2.08,6,113,,"HMSegmentedControl_drawRect:","HMSegmentedControl_drawRect:{instance}.0f8cfeaafe528d71c9e70549d32ab6c8",0,0,NONE,4,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,263,887,N,"void HMSegmentedControl_drawRect:(class HMSegmentedControl *self, struct CGRect rect)",115,0.00,1.99,0,97,,"HMSegmentedControl_frameForFillerSelectionIndicator","HMSegmentedControl_frameForFillerSelectionIndicator{instance}.ee003ec468962badb351fdc66dbf4daf",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,594,887,N,"struct CGRect HMSegmentedControl_frameForFillerSelectionIndicator(class HMSegmentedControl *self)",22,0.00,1.38,12,11,,"HMSegmentedControl_frameForSelectionIndicator","HMSegmentedControl_frameForSelectionIndicator{instance}.fab573ad9ae86c7cadaf030789e843c9",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,533,887,N,"struct CGRect HMSegmentedControl_frameForSelectionIndicator(class HMSegmentedControl *self)",83,0.00,1.71,13,37,,"HMSegmentedControl_initWithCoder:","HMSegmentedControl_initWithCoder:{instance}.a09c14109303b8ad5c335eb9da3d110b",1,0,NONE,54,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,57,887,N,"struct objc_object *HMSegmentedControl_initWithCoder:(class HMSegmentedControl *self, class NSCoder *aDecoder)",9,0.89,2.06,0,115,57 58 59 60 62 63,"HMSegmentedControl_initWithFrame:","HMSegmentedControl_initWithFrame:{instance}.a49a182bda2ad6bcf70effd8929a23fc",1,0,NONE,48,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,65,887,N,"struct objc_object *HMSegmentedControl_initWithFrame:(class HMSegmentedControl *self, struct CGRect frame)",8,0.88,2.07,1,115,65 66 68 69 72 73,"HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:","HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:{instance}.b753ee5d390184caf95711bd19d683b5",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,100,887,N,"struct objc_object *HMSegmentedControl_initWithSectionImages:sectionSelectedImages:titlesForSections:(class HMSegmentedControl *self, class NSArray *sectionImages, class NSArray *sectionSelectedImages, class NSArray *sectiontitles)",17,0.00,2.09,0,122,,"HMSegmentedControl_initWithSectionImages:sectionSelectedImages:","HMSegmentedControl_initWithSectionImages:sectionSelectedImages:{instance}.e9b578c4330b480104536188b8a8c976",1,0,NONE,78,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,87,887,N,"struct objc_object *HMSegmentedControl_initWithSectionImages:sectionSelectedImages:(class HMSegmentedControl *self, class NSArray *sectionImages, class NSArray *sectionSelectedImages)",11,0.91,2.08,0,118,87 88 90 91 92 93 94 97 98,"HMSegmentedControl_initWithSectionTitles:","HMSegmentedControl_initWithSectionTitles:{instance}.437880827dc06daf2642eb51cedee689",0,0,NONE,57,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,75,887,N,"struct objc_object *HMSegmentedControl_initWithSectionTitles:(class HMSegmentedControl *self, class NSArray *sectiontitles)",10,0.00,2.08,0,118,,"HMSegmentedControl_layoutSubviews","HMSegmentedControl_layoutSubviews{instance}.68711c72c0e4854dcc75ef707417c22e",1,0,NONE,22,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,165,887,N,"void HMSegmentedControl_layoutSubviews(class HMSegmentedControl *self)",4,1.00,1.76,0,57,165 166 168 169,"HMSegmentedControl_measureTitleAtIndex:","HMSegmentedControl_measureTitleAtIndex:{instance}.b9e49ac420b85b440d716583a1199bd7",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,219,887,N,"struct CGSize HMSegmentedControl_measureTitleAtIndex:(class HMSegmentedControl *self, unsigned long index)",60,0.00,1.65,24,20,,"HMSegmentedControl_notifyForSegmentChangeToIndex:","HMSegmentedControl_notifyForSegmentChangeToIndex:{instance}.9961984e3a59a06f9dce68085bd94b07",4,0,NONE,150,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,852,887,N,"void HMSegmentedControl_notifyForSegmentChangeToIndex:(class HMSegmentedControl *self, long index)",12,1.00,1.18,11,3,852 853 854 856 857 858,"HMSegmentedControl_resultingSelectedTitleTextAttributes","HMSegmentedControl_resultingSelectedTitleTextAttributes{instance}.cc39ce9e58be4ecf606a42f75b7a1e18",4,0,NONE,218,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,877,887,N,"class NSDictionary *HMSegmentedControl_resultingSelectedTitleTextAttributes(class HMSegmentedControl *self)",9,1.00,1.56,26,9,877 878 880 881 884 885,"HMSegmentedControl_resultingTitleTextAttributes","HMSegmentedControl_resultingTitleTextAttributes{instance}.c6edf072205c8920b9c3804bcb465668",2,0,NONE,144,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,862,887,N,"class NSDictionary *HMSegmentedControl_resultingTitleTextAttributes(class HMSegmentedControl *self)",10,1.00,1.54,27,7,862 863 864 865 868 870 871 874 875,"HMSegmentedControl_scrollToSelectedSegmentIndex:","HMSegmentedControl_scrollToSelectedSegmentIndex:{instance}.3b10d351a059eceb4ce7dcc296c10e6b",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,738,887,N,"void HMSegmentedControl_scrollToSelectedSegmentIndex:(class HMSegmentedControl *self, _Bool animated)",33,0.00,1.40,11,13,,"HMSegmentedControl_sectionCount","HMSegmentedControl_sectionCount{instance}.8f2d3f243fe8914f47b850886fe77ce5",5,0,NONE,204,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,665,887,N,"unsigned long HMSegmentedControl_sectionCount(class HMSegmentedControl *self)",16,1.00,0.95,4,4,665 666 667 668 669 670 673 674,"HMSegmentedControl_setArrowFrame","HMSegmentedControl_setArrowFrame{instance}.5826476954afd05d70ceb71ec673b941",0,0,NONE,11,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,499,887,N,"void HMSegmentedControl_setArrowFrame(class HMSegmentedControl *self)",30,0.00,1.80,12,50,,"HMSegmentedControl_setBorderType:","HMSegmentedControl_setBorderType:{instance}.913cdb23a533132e5838aec6b4e59339",1,0,NONE,26,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,212,887,N,"void HMSegmentedControl_setBorderType:(class HMSegmentedControl *self, int borderType)",4,1.00,0.30,0,1,212 213 214 215,"HMSegmentedControl_setFrame:","HMSegmentedControl_setFrame:{instance}.1c7263eacfefb1784864fef2d128686f",0,0,NONE,4,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,171,887,N,"void HMSegmentedControl_setFrame:(class HMSegmentedControl *self, struct CGRect frame)",4,0.00,1.76,0,56,,"HMSegmentedControl_setSectionImages:","HMSegmentedControl_setSectionImages:{instance}.dd1712712826815f898cd900d8051af2",1,0,NONE,32,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,183,887,N,"void HMSegmentedControl_setSectionImages:(class HMSegmentedControl *self, class NSArray *sectionImages)",4,1.00,0.60,2,1,183 184 186 187,"HMSegmentedControl_setSectionTitles:","HMSegmentedControl_setSectionTitles:{instance}.659c7c1b9fb7032b7e893febe52349bc",1,0,NONE,32,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,177,887,N,"void HMSegmentedControl_setSectionTitles:(class HMSegmentedControl *self, class NSArray *sectionTitles)",4,1.00,0.60,2,1,177 178 180 181,"HMSegmentedControl_setSegmentWidthStyle:","HMSegmentedControl_setSegmentWidthStyle:{instance}.0e2d4c1c6e034b4ded13d0bda80fc966",2,0,NONE,55,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,203,887,N,"void HMSegmentedControl_setSegmentWidthStyle:(class HMSegmentedControl *self, int segmentWidthStyle)",8,1.00,0.95,7,1,203 205 206 208 210,"HMSegmentedControl_setSelectedSegmentIndex:animated:notify:","HMSegmentedControl_setSelectedSegmentIndex:animated:notify:{instance}.e28550bafd2dd200d908ec93bf0f5f6f",0,0,SYMOPS TIMEOUT (334),668,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,783,887,N,"void HMSegmentedControl_setSelectedSegmentIndex:animated:notify:(class HMSegmentedControl *self, unsigned long index, _Bool animated, _Bool notify)",64,0.00,1.96,11,79,,"HMSegmentedControl_setSelectedSegmentIndex:animated:","HMSegmentedControl_setSelectedSegmentIndex:animated:{instance}.2d10a374506ae4092dce3c89aa0d3ed2",1,0,NONE,24,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,779,887,N,"void HMSegmentedControl_setSelectedSegmentIndex:animated:(class HMSegmentedControl *self, unsigned long index, _Bool animated)",3,1.00,1.90,0,79,779 780 781,"HMSegmentedControl_setSelectedSegmentIndex:","HMSegmentedControl_setSelectedSegmentIndex:{instance}.7c671210f6f2a504f070e13fa74c6c0f",1,0,NONE,20,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,775,887,N,"void HMSegmentedControl_setSelectedSegmentIndex:(class HMSegmentedControl *self, long index)",3,1.00,1.94,7,79,775 776 777,"HMSegmentedControl_setSelectionIndicatorBoxOpacity:","HMSegmentedControl_setSelectionIndicatorBoxOpacity:{instance}.45b69f43098a4683dfc106f58afed905",2,0,NONE,53,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,197,887,N,"void HMSegmentedControl_setSelectionIndicatorBoxOpacity:(class HMSegmentedControl *self, double selectionIndicatorBoxOpacity)",4,1.00,1.00,7,2,197 198 200 201,"HMSegmentedControl_setSelectionIndicatorLocation:","HMSegmentedControl_setSelectionIndicatorLocation:{instance}.a53daba01d6a3f4bf906c7cecf124d14",2,0,NONE,53,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,189,887,N,"void HMSegmentedControl_setSelectionIndicatorLocation:(class HMSegmentedControl *self, int selectionIndicatorLocation)",8,1.00,0.95,7,1,189 190 192 193 195,"HMSegmentedControl_totalSegmentedControlWidth","HMSegmentedControl_totalSegmentedControlWidth{instance}.0d2a745a35745340bb11b6dca1981618",8,0,NONE,315,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,728,887,N,"double HMSegmentedControl_totalSegmentedControlWidth(class HMSegmentedControl *self)",16,0.88,1.18,4,10,728 729 730 731 732 734 736,"HMSegmentedControl_touchesEnded:withEvent:","HMSegmentedControl_touchesEnded:withEvent:{instance}.4e627b0727b096ec8303653816d71374",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,688,887,N,"void HMSegmentedControl_touchesEnded:withEvent:(class HMSegmentedControl *self, class NSSet *touches, class UIEvent *event)",58,0.00,1.94,0,86,,"HMSegmentedControl_updateSegmentsRects","HMSegmentedControl_updateSegmentsRects{instance}.84ec9da3b15ae6609959e7b9d4e514d6",0,0,NONE,4,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,613,887,N,"void HMSegmentedControl_updateSegmentsRects(class HMSegmentedControl *self)",129,0.00,1.77,3,55,,"HMSegmentedControl_willMoveToSuperview:","HMSegmentedControl_willMoveToSuperview:{instance}.664e57902a9674b629014432c158bbe2",2,0,NONE,88,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,676,887,N,"void HMSegmentedControl_willMoveToSuperview:(class HMSegmentedControl *self, class UIView *newSuperview)",12,1.00,1.76,0,56,676 678 679 681 682 684,"MBBarProgressView_dealloc","MBBarProgressView_dealloc{instance}.adf1ad15c84766ba9dcf79183c69c3d4",1,0,NONE,18,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,915,1033,N,"void MBBarProgressView_dealloc(class MBBarProgressView *self)",3,1.00,0.85,0,6,915 916 923,"MBBarProgressView_drawRect:","MBBarProgressView_drawRect:{instance}.320d681186c8fba8f6b277de3f5578a2",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,927,1033,N,"void MBBarProgressView_drawRect:(class MBBarProgressView *self, struct CGRect rect)",102,0.00,1.23,0,16,,"MBBarProgressView_initWithFrame:","MBBarProgressView_initWithFrame:{instance}.ed6320a3deccb73365df0525f4c1b164",1,0,NONE,112,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,901,1033,N,"struct objc_object *MBBarProgressView_initWithFrame:(class MBBarProgressView *self, struct CGRect frame)",14,0.93,1.28,7,11,901 902 903 904 905 906 907 908 909 910 912 913,"MBBarProgressView_init","MBBarProgressView_init{instance}.d718a21a2e82160043ea8993b48ff857",1,0,NONE,24,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,897,1033,N,"struct objc_object *MBBarProgressView_init(class MBBarProgressView *self)",3,1.00,1.30,6,13,897 898 899,"MBBarProgressView_observableKeypaths","MBBarProgressView_observableKeypaths{instance}.39b90d036d77a64fc5e4fecf6065c87c",1,0,NONE,44,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,1025,1033,N,"class NSArray *MBBarProgressView_observableKeypaths(class MBBarProgressView *self)",3,1.00,1.15,11,2,1025 1026 1027,"MBBarProgressView_observeValueForKeyPath:ofObject:change:context:","MBBarProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.7954f9a6af46f9f68c1a1f6b5a2ccdd2",1,0,NONE,24,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,1029,1033,N,"void MBBarProgressView_observeValueForKeyPath:ofObject:change:context:(class MBBarProgressView *self, class NSString *keyPath, struct objc_object *object, class NSDictionary *change, void *context)",3,1.00,0.30,0,1,1029 1030 1031,"MBBarProgressView_registerForKVO","MBBarProgressView_registerForKVO{instance}.071c8b1636d94f57ae8971bc36daf118",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,1013,1033,N,"void MBBarProgressView_registerForKVO(class MBBarProgressView *self)",9,0.67,1.15,8,5,1013 1014 1017,"MBBarProgressView_unregisterFromKVO","MBBarProgressView_unregisterFromKVO{instance}.b5a5120611688f493d5727fdfa6d5960",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,1019,1033,N,"void MBBarProgressView_unregisterFromKVO(class MBBarProgressView *self)",9,0.67,0.85,1,5,1019 1020 1023,"MBProgressHUD_HUDForView:","MBProgressHUD_HUDForView:{class}.a2951ab8562d7ef65f3c11867a36db30",3,0,NONE,346,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,142,1033,N,"struct objc_object *MBProgressHUD_HUDForView:(class UIView *view)",15,0.80,0.78,1,4,142 143 144 145 146 149 150,"MBProgressHUD_allHUDsForView:","MBProgressHUD_allHUDsForView:{class}.c62400802f12bd5a57844c12fcb0585f",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,152,1033,N,"class NSArray *MBProgressHUD_allHUDsForView:(class UIView *view)",16,0.00,0.90,1,6,,"MBProgressHUD_animationFinished:finished:context:","MBProgressHUD_animationFinished:finished:context:{instance}.9c5e683b9e4ea724431986aec092468a",4,0,NONE,117,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,359,1033,N,"void MBProgressHUD_animationFinished:finished:context:(class MBProgressHUD *self, class NSString *animationID, _Bool finished, void *context)",3,1.00,0.95,0,8,359 360 361,"MBProgressHUD_cleanUp","MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3",0,0,NONE,139,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,438,1033,N,"void MBProgressHUD_cleanUp(class MBProgressHUD *self)",6,0.00,1.53,6,27,,"MBProgressHUD_dealloc","MBProgressHUD_dealloc{instance}.734bfbc384d83cb0e26dba7831bb5b5a",1,0,NONE,26,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,220,1033,N,"void MBProgressHUD_dealloc(class MBProgressHUD *self)",4,1.00,1.00,0,9,220 221 222 243,"MBProgressHUD_didMoveToSuperview","MBProgressHUD_didMoveToSuperview{instance}.bdd65a2c02acb5f730c9ffafb0a5d09e",1,0,NONE,18,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,302,1033,N,"void MBProgressHUD_didMoveToSuperview(class MBProgressHUD *self)",3,1.00,0.78,0,5,302 303 304,"MBProgressHUD_done","MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a",7,0,SYMOPS TIMEOUT (334),539,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,363,1033,N,"void MBProgressHUD_done(class MBProgressHUD *self)",20,1.00,1.34,14,7,363 364 365 366 367 368 371 372 373 376 377 379,"MBProgressHUD_drawRect:","MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604",2,0,NONE,583,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,614,1033,N,"void MBProgressHUD_drawRect:(class MBProgressHUD *self, struct CGRect rect)",42,0.60,1.49,0,30,614 616 617 619 639 640 642 647 649 650 651 652 653 654 655 656 657 658 659 661 662,"MBProgressHUD_handleGraceTimer:","MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9",3,0,NONE,87,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,289,1033,N,"void MBProgressHUD_handleGraceTimer:(class MBProgressHUD *self, class NSTimer *theTimer)",6,1.00,1.11,0,12,289 291 292 294,"MBProgressHUD_handleMinShowTimer:","MBProgressHUD_handleMinShowTimer:{instance}.7aafa41664c3ff7af3a291cab98261c3",8,0,NONE,206,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,296,1033,N,"void MBProgressHUD_handleMinShowTimer:(class MBProgressHUD *self, class NSTimer *theTimer)",3,1.00,1.28,0,18,296 297 298,"MBProgressHUD_hide:afterDelay:","MBProgressHUD_hide:afterDelay:{instance}.c859a390b6e21c3da53cc55db145fc51",1,0,NONE,28,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,279,1033,N,"void MBProgressHUD_hide:afterDelay:(class MBProgressHUD *self, _Bool animated, double delay)",3,1.00,0.48,0,2,279 280 281,"MBProgressHUD_hide:","MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507",5,0,SYMOPS TIMEOUT (334),590,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,262,1033,N,"void MBProgressHUD_hide:(class MBProgressHUD *self, _Bool animated)",37,0.59,1.57,10,26,262 263 264 267 268 269 276 277,"MBProgressHUD_hideAllHUDsForView:animated:","MBProgressHUD_hideAllHUDsForView:animated:{class}.0c50aff8a43d35a50e24dbcc63a30a32",1,0,NONE,153,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,133,1033,N,"unsigned long MBProgressHUD_hideAllHUDsForView:animated:(class UIView *view, _Bool animated)",12,0.67,1.57,0,36,133 134 135 139 140,"MBProgressHUD_hideDelayed:","MBProgressHUD_hideDelayed:{instance}.c1ee27a326a7aff4bb96a0c3c0081baf",0,0,NONE,176,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,283,1033,N,"void MBProgressHUD_hideDelayed:(class MBProgressHUD *self, class NSNumber *animated)",3,0.00,1.46,0,28,,"MBProgressHUD_hideHUDForView:animated:","MBProgressHUD_hideHUDForView:animated:{class}.6464d2a2482f9e32e72a33627277d762",1,0,NONE,185,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,123,1033,N,"_Bool MBProgressHUD_hideHUDForView:animated:(class UIView *view, _Bool animated)",11,0.64,1.53,0,33,123 124 125 130 131,"MBProgressHUD_hideUsingAnimation:","MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03",8,0,SYMOPS TIMEOUT (334),631,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,334,1033,N,"void MBProgressHUD_hideUsingAnimation:(class MBProgressHUD *self, _Bool animated)",26,0.85,1.48,12,17,334 336 337 338 339 340 343 345 349 350 353 354 356 357,"MBProgressHUD_initWithFrame:","MBProgressHUD_initWithFrame:{instance}.46a9a5ebd85df85c40e4ca277186520f",0,0,NONE,79,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,165,1033,N,"struct objc_object *MBProgressHUD_initWithFrame:(class MBProgressHUD *self, struct CGRect frame)",39,0.00,1.90,2,76,,"MBProgressHUD_initWithView:","MBProgressHUD_initWithView:{instance}.56c371965dcee9d54c2d7a562e2ae498",1,0,NONE,105,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,211,1033,N,"struct objc_object *MBProgressHUD_initWithView:(class MBProgressHUD *self, class UIView *view)",22,0.45,1.90,1,78,211 212 213 214,"MBProgressHUD_initWithWindow:","MBProgressHUD_initWithWindow:{instance}.d9abb98f4c74d9d83026534b730b52d2",1,0,NONE,24,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,216,1033,N,"struct objc_object *MBProgressHUD_initWithWindow:(class MBProgressHUD *self, class UIWindow *window)",3,1.00,1.90,0,79,216 217 218,"MBProgressHUD_launchExecution","MBProgressHUD_launchExecution{instance}.65b7de815299c22603cdc0a12874e621",1,0,NONE,36,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,425,1033,N,"void MBProgressHUD_launchExecution(class MBProgressHUD *self)",5,1.00,0.48,0,2,425 426 430 434 436,"MBProgressHUD_layoutSubviews","MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0",0,0,NONE,92,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,526,1033,N,"void MBProgressHUD_layoutSubviews(class MBProgressHUD *self)",152,0.00,1.11,0,12,,"MBProgressHUD_observableKeypaths","MBProgressHUD_observableKeypaths{instance}.1d43b626b757e9a1ab7fb2a4953c8d2d",1,0,NONE,80,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,678,1033,N,"class NSArray *MBProgressHUD_observableKeypaths(class MBProgressHUD *self)",3,1.00,0.95,6,2,678 679 680 681,"MBProgressHUD_observeValueForKeyPath:ofObject:change:context:","MBProgressHUD_observeValueForKeyPath:ofObject:change:context:{instance}.6f2717bd4c58c58b1cd5304e7bfb403b",1,0,NONE,109,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,683,1033,N,"void MBProgressHUD_observeValueForKeyPath:ofObject:change:context:(class MBProgressHUD *self, class NSString *keyPath, struct objc_object *object, class NSDictionary *change, void *context)",13,0.69,1.71,0,50,683 684 685 689,"MBProgressHUD_registerForKVO","MBProgressHUD_registerForKVO{instance}.74d4196c6bc96800ebeadb3eade5e76a",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,666,1033,N,"void MBProgressHUD_registerForKVO(class MBProgressHUD *self)",9,0.67,0.95,3,5,666 667 670,"MBProgressHUD_registerForNotifications","MBProgressHUD_registerForNotifications{instance}.c083e50aaf59e994cdd425e4c9cf446b",1,0,NONE,32,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,719,1033,N,"void MBProgressHUD_registerForNotifications(class MBProgressHUD *self)",4,1.00,0.78,3,2,719 721 723 724 726,"MBProgressHUD_setupLabels","MBProgressHUD_setupLabels{instance}.ea2ff0fb299d03874b01a906a7e5f181",1,0,NONE,218,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,452,1033,N,"void MBProgressHUD_setupLabels(class MBProgressHUD *self)",22,1.00,1.34,3,18,452 453 454 455 456 457 458 459 460 461 463 464 465 466 467 468 469 470 471 472 473 474,"MBProgressHUD_show:","MBProgressHUD_show:{instance}.ac44c85674baa495a162f44dec2bca1f",3,0,NONE,264,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,247,1033,N,"void MBProgressHUD_show:(class MBProgressHUD *self, _Bool animated)",31,0.61,1.43,6,20,247 248 249 251 252 253 254 258 260,"MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:","MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:{instance}.cc35373f5b0ef6d67ba0a2cd43d0a077",2,0,NONE,78,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,401,1033,N,"void MBProgressHUD_showAnimated:whileExecutingBlock:completionBlock:(class MBProgressHUD *self, _Bool animated, _fn_ (*block), _fn_ (*completion))",4,1.00,1.62,0,41,401 402 403 404,"MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:","MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:{instance}.5f282b5baff14a6b325db22e8dc79cb5",2,0,NONE,162,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,410,1033,N,"void MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:(class MBProgressHUD *self, _Bool animated, _fn_ (*block), class NSObject *queue, _fn_ (*completion))",7,1.00,1.63,3,39,410 412 413 414 420 421,"MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:","MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:{instance}.939c8bef4c804dcce1a8f8504d065463",2,0,NONE,56,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,406,1033,N,"void MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:(class MBProgressHUD *self, _Bool animated, _fn_ (*block), class NSObject *queue)",3,1.00,1.61,0,40,406 407 408,"MBProgressHUD_showAnimated:whileExecutingBlock:","MBProgressHUD_showAnimated:whileExecutingBlock:{instance}.31adcee70bd29a2315f5a590715c3deb",2,0,NONE,71,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,396,1033,N,"void MBProgressHUD_showAnimated:whileExecutingBlock:(class MBProgressHUD *self, _Bool animated, _fn_ (*block))",4,1.00,1.62,0,41,396 397 398 399,"MBProgressHUD_showHUDAddedTo:animated:","MBProgressHUD_showHUDAddedTo:animated:{class}.a5ee486a46c5d3c99b9e068e9ea4baad",0,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,115,1033,N,"struct objc_object *MBProgressHUD_showHUDAddedTo:animated:(class UIView *view, _Bool animated)",7,0.00,1.40,0,24,,"MBProgressHUD_showUsingAnimation:","MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be",2,0,NONE,202,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,308,1033,N,"void MBProgressHUD_showUsingAnimation:(class MBProgressHUD *self, _Bool animated)",35,0.80,1.30,8,11,308 310 311 313 315 318 320 321 322 323 324 327 330 332,"MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:","MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:{instance}.0961e1f2841c54f70f3dc0b695dfc84d",2,0,NONE,142,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,383,1033,N,"void MBProgressHUD_showWhileExecuting:onTarget:withObject:animated:(class MBProgressHUD *self, void *method, struct objc_object *target, struct objc_object *object, _Bool animated)",8,1.00,1.38,0,23,383 384 385 386 388 389 391 392,"MBProgressHUD_statusBarOrientationDidChange:","MBProgressHUD_statusBarOrientationDidChange:{instance}.872a47e680449f7f49e472ccf7e9d082",1,0,NONE,76,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,736,1033,N,"void MBProgressHUD_statusBarOrientationDidChange:(class MBProgressHUD *self, class NSNotification *notification)",13,0.62,0.78,0,5,736 737 738 739 743,"MBProgressHUD_unregisterFromKVO","MBProgressHUD_unregisterFromKVO{instance}.bbf3aaf60e868fa0fb966ae29a1af573",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,672,1033,N,"void MBProgressHUD_unregisterFromKVO(class MBProgressHUD *self)",9,0.67,0.85,1,5,672 673 676,"MBProgressHUD_unregisterFromNotifications","MBProgressHUD_unregisterFromNotifications{instance}.de0d4125b86d3858fd69944f1d235402",1,0,NONE,32,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,728,1033,N,"void MBProgressHUD_unregisterFromNotifications(class MBProgressHUD *self)",4,1.00,0.60,1,2,728 730 731 733,"MBProgressHUD_updateForCurrentOrientationAnimated:","MBProgressHUD_updateForCurrentOrientationAnimated:{instance}.6fe6a2b1a661f1f307de4fb6a68bd0fb",1,0,NONE,26,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,746,1033,N,"void MBProgressHUD_updateForCurrentOrientationAnimated:(class MBProgressHUD *self, _Bool animated)",8,0.62,0.85,2,4,746 748 782,"MBProgressHUD_updateIndicators","MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,476,1033,N,"void MBProgressHUD_updateIndicators(class MBProgressHUD *self)",69,0.00,1.57,5,31,,"MBProgressHUD_updateUIForKeypath:","MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,691,1033,N,"void MBProgressHUD_updateUIForKeypath:(class MBProgressHUD *self, class NSString *keyPath)",55,0.00,1.69,1,47,,"MBRoundProgressView_dealloc","MBRoundProgressView_dealloc{instance}.f76e97c78e356529b6d3487d19b1a412",1,0,NONE,18,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,809,1033,N,"void MBRoundProgressView_dealloc(class MBRoundProgressView *self)",3,1.00,0.85,0,6,809 810 816,"MBRoundProgressView_drawRect:","MBRoundProgressView_drawRect:{instance}.5dded631db9e81761adbc52c74e3a158",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,820,1033,N,"void MBRoundProgressView_drawRect:(class MBRoundProgressView *self, struct CGRect rect)",51,0.00,1.32,0,20,,"MBRoundProgressView_initWithFrame:","MBRoundProgressView_initWithFrame:{instance}.202df68ce7c2e37e1d8f93454b69c4d1",1,0,NONE,96,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,795,1033,N,"struct objc_object *MBRoundProgressView_initWithFrame:(class MBRoundProgressView *self, struct CGRect frame)",14,0.93,1.28,7,11,795 796 797 798 799 800 801 802 803 804 806 807,"MBRoundProgressView_init","MBRoundProgressView_init{instance}.d5141eb9f853d4fabd440a664b453b2f",1,0,NONE,24,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,791,1033,N,"struct objc_object *MBRoundProgressView_init(class MBRoundProgressView *self)",3,1.00,1.30,6,13,791 792 793,"MBRoundProgressView_observableKeypaths","MBRoundProgressView_observableKeypaths{instance}.88a67d54a2d7175b9b7f5a626393a834",1,0,NONE,44,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,882,1033,N,"class NSArray *MBRoundProgressView_observableKeypaths(class MBRoundProgressView *self)",3,1.00,1.15,11,2,882 883 884,"MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:","MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:{instance}.3562ed8d8fbf2b3acfad83fc0f3fcfd0",1,0,NONE,24,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,886,1033,N,"void MBRoundProgressView_observeValueForKeyPath:ofObject:change:context:(class MBRoundProgressView *self, class NSString *keyPath, struct objc_object *object, class NSDictionary *change, void *context)",3,1.00,0.30,0,1,886 887 888,"MBRoundProgressView_registerForKVO","MBRoundProgressView_registerForKVO{instance}.56e6d0e76d20137d6b5a2056d5683113",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,870,1033,N,"void MBRoundProgressView_registerForKVO(class MBRoundProgressView *self)",9,0.67,1.15,8,5,870 871 874,"MBRoundProgressView_unregisterFromKVO","MBRoundProgressView_unregisterFromKVO{instance}.97841886debac0d49b46482098a4e1d7",1,0,NONE,119,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,876,1033,N,"void MBRoundProgressView_unregisterFromKVO(class MBRoundProgressView *self)",9,0.67,0.85,1,5,876 877 880,"MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh","MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh{instance}.931b825764944eff97f78ef4c2c44ebd",1,0,NONE,18,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,41,0,N,"double MJRefreshAutoFooter_appearencePercentTriggerAutoRefresh(class MJRefreshAutoFooter *self)",3,1.00,0.30,0,1,41 43 44,"MJRefreshAutoFooter_prepare","MJRefreshAutoFooter_prepare{instance}.81fdaf533264e53838439b6af78408c2",0,0,NONE,22,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,47,0,N,"void MJRefreshAutoFooter_prepare(class MJRefreshAutoFooter *self)",5,0.00,0.60,0,3,,"MJRefreshAutoFooter_scrollViewContentOffsetDidChange:","MJRefreshAutoFooter_scrollViewContentOffsetDidChange:{instance}.bcfcda2745da14825e78d76c540e5ff0",4,0,SYMOPS TIMEOUT (334),577,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,66,0,N,"void MJRefreshAutoFooter_scrollViewContentOffsetDidChange:(class MJRefreshAutoFooter *self, class NSDictionary *change)",35,0.63,1.18,0,14,66 68 70 72 84,"MJRefreshAutoFooter_scrollViewContentSizeDidChange:","MJRefreshAutoFooter_scrollViewContentSizeDidChange:{instance}.c95f98648e58af09c6bb5f9a39329ee1",2,0,NONE,57,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,58,0,N,"void MJRefreshAutoFooter_scrollViewContentSizeDidChange:(class MJRefreshAutoFooter *self, class NSDictionary *change)",4,1.00,0.70,0,4,58 60 63 64,"MJRefreshAutoFooter_scrollViewPanStateDidChange:","MJRefreshAutoFooter_scrollViewPanStateDidChange:{instance}.40aa0d75b89f5a74cf08c78c183d6a19",2,0,NONE,66,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,86,0,N,"void MJRefreshAutoFooter_scrollViewPanStateDidChange:(class MJRefreshAutoFooter *self, class NSDictionary *change)",26,0.42,1.04,0,10,86 88 90 92 103,"MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:","MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:{instance}.6d7e658eb08c918e2665dda4d02bbe0e",1,0,NONE,20,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,36,0,N,"void MJRefreshAutoFooter_setAppearencePercentTriggerAutoRefresh:(class MJRefreshAutoFooter *self, double appearencePercentTriggerAutoRefresh)",3,1.00,0.30,0,1,36 38 39,"MJRefreshAutoFooter_setHidden:","MJRefreshAutoFooter_setHidden:{instance}.8187ea74fc5a524dc007acb5243e7926",5,0,SYMOPS TIMEOUT (334),581,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,116,0,N,"void MJRefreshAutoFooter_setHidden:(class MJRefreshAutoFooter *self, _Bool hidden)",28,1.00,1.15,0,13,116 118 120 122 123 125 126 127 130 132,"MJRefreshAutoFooter_setState:","MJRefreshAutoFooter_setState:{instance}.bdb3fcb8173fa59cb33dd391730a20c2",4,0,NONE,182,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,105,0,N,"void MJRefreshAutoFooter_setState:(class MJRefreshAutoFooter *self, int state)",15,1.00,0.78,1,4,105 107 109 110 114,"MJRefreshAutoFooter_willMoveToSuperview:","MJRefreshAutoFooter_willMoveToSuperview:{instance}.31c9e7668989c017342140f0185c2188",7,0,NONE,365,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,17,0,N,"void MJRefreshAutoFooter_willMoveToSuperview:(class MJRefreshAutoFooter *self, class UIView *newSuperview)",17,1.00,0.95,0,8,17 19 21 22 23 27 29 30 33,"MJRefreshAutoGifFooter_gifView","MJRefreshAutoGifFooter_gifView{instance}.4ff145d45d6f0d9ac6a9b37155d3cc66",2,0,NONE,152,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,23,0,N,"class UIImageView *MJRefreshAutoGifFooter_gifView(class MJRefreshAutoGifFooter *self)",13,1.00,0.70,2,2,23 25 26 27 29 30,"MJRefreshAutoGifFooter_placeSubviews","MJRefreshAutoGifFooter_placeSubviews{instance}.792cabf0aff680ead0baef015354b3be",1,0,NONE,55,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,69,0,N,"void MJRefreshAutoGifFooter_placeSubviews(class MJRefreshAutoGifFooter *self)",16,0.38,1.11,0,12,69 71 73 82,"MJRefreshAutoGifFooter_setImages:duration:forState:","MJRefreshAutoGifFooter_setImages:duration:forState:{instance}.c46aa256d08ae2ac7749b27d92bed622",1,0,NONE,99,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,49,0,N,"void MJRefreshAutoGifFooter_setImages:duration:forState:(class MJRefreshAutoGifFooter *self, class NSArray *images, double duration, int state)",15,0.33,1.15,1,12,49 51 61,"MJRefreshAutoGifFooter_setImages:forState:","MJRefreshAutoGifFooter_setImages:forState:{instance}.bc030fd7ddd4c611d524187d37ba0372",1,0,NONE,33,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,63,0,N,"void MJRefreshAutoGifFooter_setImages:forState:(class MJRefreshAutoGifFooter *self, class NSArray *images, int state)",3,1.00,1.18,0,14,63 65 66,"MJRefreshAutoGifFooter_setState:","MJRefreshAutoGifFooter_setState:{instance}.ef45940c1ae3cbc92c2bc041ff067afa",0,0,SYMOPS TIMEOUT (334),334,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,84,0,N,"void MJRefreshAutoGifFooter_setState:(class MJRefreshAutoGifFooter *self, int state)",38,0.00,1.34,0,21,,"MJRefreshAutoGifFooter_stateDurations","MJRefreshAutoGifFooter_stateDurations{instance}.719f9f19198062078a8a0d9ea201ca6b",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,40,0,N,"class NSMutableDictionary *MJRefreshAutoGifFooter_stateDurations(class MJRefreshAutoGifFooter *self)",12,1.00,0.78,3,2,40 42 43 45 46,"MJRefreshAutoGifFooter_stateImages","MJRefreshAutoGifFooter_stateImages{instance}.ab92380ab4ded17b30f8a08f961ee684",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m,32,0,N,"class NSMutableDictionary *MJRefreshAutoGifFooter_stateImages(class MJRefreshAutoGifFooter *self)",12,1.00,0.78,3,2,32 34 35 37 38,"MJRefreshAutoNormalFooter_loadingView","MJRefreshAutoNormalFooter_loadingView{instance}.b926a86efa7bdd6b0a6a98c1e90540a4",2,0,NONE,160,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m,17,0,N,"class UIActivityIndicatorView *MJRefreshAutoNormalFooter_loadingView(class MJRefreshAutoNormalFooter *self)",14,1.00,0.85,2,4,17 19 20 21 22 24 25,"MJRefreshAutoNormalFooter_placeSubviews","MJRefreshAutoNormalFooter_placeSubviews{instance}.0f8d74171158ff20387271e6a94777f4",1,0,NONE,92,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m,42,0,N,"void MJRefreshAutoNormalFooter_placeSubviews(class MJRefreshAutoNormalFooter *self)",21,0.29,1.15,0,13,42 44 46 55,"MJRefreshAutoNormalFooter_prepare","MJRefreshAutoNormalFooter_prepare{instance}.62a05293c68d988c434dbcd79ef0ad7b",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m,35,0,N,"void MJRefreshAutoNormalFooter_prepare(class MJRefreshAutoNormalFooter *self)",4,1.00,0.70,0,4,35 37 39 40,"MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:","MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:{instance}.1740284edf4289989ed9655458e6e541",1,0,NONE,32,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m,27,0,N,"void MJRefreshAutoNormalFooter_setActivityIndicatorViewStyle:(class MJRefreshAutoNormalFooter *self, int activityIndicatorViewStyle)",5,1.00,0.60,1,2,27 29 31 32 33,"MJRefreshAutoNormalFooter_setState:","MJRefreshAutoNormalFooter_setState:{instance}.92eb8a4693eb9e978510f5f8e8d079b6",4,0,NONE,352,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m,57,0,N,"void MJRefreshAutoNormalFooter_setState:(class MJRefreshAutoNormalFooter *self, int state)",22,1.00,1.00,0,9,57 59 62 63 64 65 67,"MJRefreshAutoStateFooter_placeSubviews","MJRefreshAutoStateFooter_placeSubviews{instance}.e05bd88dad611fa3f5641cc10cf22caf",1,0,NONE,55,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,69,0,N,"void MJRefreshAutoStateFooter_placeSubviews(class MJRefreshAutoStateFooter *self)",9,0.67,0.95,0,8,69 71 73 77,"MJRefreshAutoStateFooter_prepare","MJRefreshAutoStateFooter_prepare{instance}.39111306cd810d7e8289797116b20acc",1,0,NONE,79,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,55,0,N,"void MJRefreshAutoStateFooter_prepare(class MJRefreshAutoStateFooter *self)",8,1.00,1.23,0,16,55 57 60 61 62 65 66 67,"MJRefreshAutoStateFooter_setState:","MJRefreshAutoStateFooter_setState:{instance}.41f13d685c1d0107cac76f5e6cdc6f22",6,0,NONE,374,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,79,0,N,"void MJRefreshAutoStateFooter_setState:(class MJRefreshAutoStateFooter *self, int state)",18,1.00,1.11,0,12,79 81 83 84 86 88,"MJRefreshAutoStateFooter_setTitle:forState:","MJRefreshAutoStateFooter_setTitle:forState:{instance}.a6f426bbeb7cb198331cbcece4cf4ec0",1,0,NONE,75,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,39,0,N,"void MJRefreshAutoStateFooter_setTitle:forState:(class MJRefreshAutoStateFooter *self, class NSString *title, int state)",9,0.56,1.11,1,11,39 41 44,"MJRefreshAutoStateFooter_stateLabelClick","MJRefreshAutoStateFooter_stateLabelClick{instance}.8d69ce4f9c38bcef0e235e719a0ddbdf",5,0,NONE,143,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,47,0,N,"void MJRefreshAutoStateFooter_stateLabelClick(class MJRefreshAutoStateFooter *self)",7,1.00,0.48,0,2,47 49 50 52,"MJRefreshAutoStateFooter_stateLabel","MJRefreshAutoStateFooter_stateLabel{instance}.0d1656cd91316c5fef17b9f5de691d6b",2,0,NONE,139,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,30,0,N,"class UILabel *MJRefreshAutoStateFooter_stateLabel(class MJRefreshAutoStateFooter *self)",12,1.00,0.85,4,2,30 32 33 35 36,"MJRefreshAutoStateFooter_stateTitles","MJRefreshAutoStateFooter_stateTitles{instance}.45df57b523fb4f840f1c9d536a35d61c",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m,22,0,N,"class NSMutableDictionary *MJRefreshAutoStateFooter_stateTitles(class MJRefreshAutoStateFooter *self)",12,1.00,0.78,3,2,22 24 25 27 28,"MJRefreshBackFooter_endRefreshing","MJRefreshBackFooter_endRefreshing{instance}.958680d523a94ab59c1c9601c2541ab2",0,0,NONE,4,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,126,0,N,"void MJRefreshBackFooter_endRefreshing(class MJRefreshBackFooter *self)",9,0.00,0.70,0,4,,"MJRefreshBackFooter_happenOffsetY","MJRefreshBackFooter_happenOffsetY{instance}.0dae9169061683402ab2798299f74adc",0,0,NONE,17,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,157,0,N,"double MJRefreshBackFooter_happenOffsetY(class MJRefreshBackFooter *self)",9,0.00,0.95,3,5,,"MJRefreshBackFooter_heightForContentBreakView","MJRefreshBackFooter_heightForContentBreakView{instance}.6c28d740d05c68bd5806d8010e497a29",0,0,NONE,4,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,150,0,N,"double MJRefreshBackFooter_heightForContentBreakView(class MJRefreshBackFooter *self)",4,0.00,0.95,4,4,,"MJRefreshBackFooter_noticeNoMoreData","MJRefreshBackFooter_noticeNoMoreData{instance}.83d8a6971a587c2fe5193c2bc7f4b031",0,0,NONE,4,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,137,0,N,"void MJRefreshBackFooter_noticeNoMoreData(class MJRefreshBackFooter *self)",9,0.00,0.70,0,4,,"MJRefreshBackFooter_scrollViewContentOffsetDidChange:","MJRefreshBackFooter_scrollViewContentOffsetDidChange:{instance}.f883c7a60628c818fb9a69ebcf62f187",1,0,NONE,44,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,27,0,N,"void MJRefreshBackFooter_scrollViewContentOffsetDidChange:(class MJRefreshBackFooter *self, class NSDictionary *change)",55,0.11,1.52,0,32,27 29 32 69,"MJRefreshBackFooter_scrollViewContentSizeDidChange:","MJRefreshBackFooter_scrollViewContentSizeDidChange:{instance}.665d5ffac44fdda6b0cfcaf9f76338c2",0,0,NONE,8,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,71,0,N,"void MJRefreshBackFooter_scrollViewContentSizeDidChange:(class MJRefreshBackFooter *self, class NSDictionary *change)",12,0.00,0.95,1,7,,"MJRefreshBackFooter_setState:","MJRefreshBackFooter_setState:{instance}.2a84f32e6c9d600cfa0c5f9c490fa00b",2,0,NONE,196,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,83,0,N,"void MJRefreshBackFooter_setState:(class MJRefreshBackFooter *self, int state)",33,0.52,1.46,1,27,83 85 88 106 123,"MJRefreshBackFooter_willMoveToSuperview:","MJRefreshBackFooter_willMoveToSuperview:{instance}.5dcec01faa2292110b1de8e64a12c539",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,19,0,N,"void MJRefreshBackFooter_willMoveToSuperview:(class MJRefreshBackFooter *self, class UIView *newSuperview)",4,1.00,1.00,0,9,19 21 23 24,"MJRefreshBackGifFooter_gifView","MJRefreshBackGifFooter_gifView{instance}.7c4a05bcc8f049050cffa895709f2611",2,0,NONE,152,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,23,0,N,"class UIImageView *MJRefreshBackGifFooter_gifView(class MJRefreshBackGifFooter *self)",13,1.00,0.78,3,2,23 25 26 27 29 30,"MJRefreshBackGifFooter_placeSubviews","MJRefreshBackGifFooter_placeSubviews{instance}.1cf5a34d6185752d129aad4c43b0cf42",1,0,NONE,55,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,80,0,N,"void MJRefreshBackGifFooter_placeSubviews(class MJRefreshBackGifFooter *self)",16,0.38,1.15,0,13,80 82 84 93,"MJRefreshBackGifFooter_setImages:duration:forState:","MJRefreshBackGifFooter_setImages:duration:forState:{instance}.bd185713fbda471cfa0b26d0475db1d6",1,0,NONE,99,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,49,0,N,"void MJRefreshBackGifFooter_setImages:duration:forState:(class MJRefreshBackGifFooter *self, class NSArray *images, double duration, int state)",15,0.33,1.15,1,12,49 51 61,"MJRefreshBackGifFooter_setImages:forState:","MJRefreshBackGifFooter_setImages:forState:{instance}.f959fd72b4774da01ea194a4b34ee359",1,0,NONE,33,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,63,0,N,"void MJRefreshBackGifFooter_setImages:forState:(class MJRefreshBackGifFooter *self, class NSArray *images, int state)",3,1.00,1.18,0,14,63 65 66,"MJRefreshBackGifFooter_setPullingPercent:","MJRefreshBackGifFooter_setPullingPercent:{instance}.157a977e4c33fa60e38cb624a19f24de",0,0,NONE,66,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,69,0,N,"void MJRefreshBackGifFooter_setPullingPercent:(class MJRefreshBackGifFooter *self, double pullingPercent)",20,0.00,1.18,0,14,,"MJRefreshBackGifFooter_setState:","MJRefreshBackGifFooter_setState:{instance}.fa1a5e8a04db08dde17ff7de59c16477",0,0,SYMOPS TIMEOUT (334),334,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,95,0,N,"void MJRefreshBackGifFooter_setState:(class MJRefreshBackGifFooter *self, int state)",42,0.00,1.34,0,21,,"MJRefreshBackGifFooter_stateDurations","MJRefreshBackGifFooter_stateDurations{instance}.ecff20c8de39266ddc0f975a0f4306e2",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,40,0,N,"class NSMutableDictionary *MJRefreshBackGifFooter_stateDurations(class MJRefreshBackGifFooter *self)",12,1.00,0.78,3,2,40 42 43 45 46,"MJRefreshBackGifFooter_stateImages","MJRefreshBackGifFooter_stateImages{instance}.724b5260dc41e21938f90f2360672187",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m,32,0,N,"class NSMutableDictionary *MJRefreshBackGifFooter_stateImages(class MJRefreshBackGifFooter *self)",12,1.00,0.85,4,2,32 34 35 37 38,"MJRefreshBackNormalFooter_arrowView","MJRefreshBackNormalFooter_arrowView{instance}.4311ef7cafa4a9ee91bbac226b717da9",2,0,NONE,207,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,20,0,N,"class UIImageView *MJRefreshBackNormalFooter_arrowView(class MJRefreshBackNormalFooter *self)",20,0.90,1.04,5,5,20 22 23 24 25 27 28,"MJRefreshBackNormalFooter_loadingView","MJRefreshBackNormalFooter_loadingView{instance}.d862d1537eaf4f13b3ea928a9d7e6bb2",2,0,NONE,160,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,31,0,N,"class UIActivityIndicatorView *MJRefreshBackNormalFooter_loadingView(class MJRefreshBackNormalFooter *self)",14,1.00,0.95,4,4,31 33 34 35 36 38 39,"MJRefreshBackNormalFooter_placeSubviews","MJRefreshBackNormalFooter_placeSubviews{instance}.14a691c735954cea598f1c42945a8ade",0,0,NONE,9,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,56,0,N,"void MJRefreshBackNormalFooter_placeSubviews(class MJRefreshBackNormalFooter *self)",27,0.00,1.36,0,22,,"MJRefreshBackNormalFooter_prepare","MJRefreshBackNormalFooter_prepare{instance}.d348875f78d00052355c482b471988da",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,49,0,N,"void MJRefreshBackNormalFooter_prepare(class MJRefreshBackNormalFooter *self)",4,1.00,0.70,0,4,49 51 53 54,"MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:","MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:{instance}.c11249674bf6ed2701a1780e8cf790ae",1,0,NONE,32,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,41,0,N,"void MJRefreshBackNormalFooter_setActivityIndicatorViewStyle:(class MJRefreshBackNormalFooter *self, int activityIndicatorViewStyle)",5,1.00,0.60,1,2,41 43 45 46 47,"MJRefreshBackNormalFooter_setState:","MJRefreshBackNormalFooter_setState:{instance}.bfb37954287cc1242b9371c8e0c2c53d",2,0,NONE,143,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,80,0,N,"void MJRefreshBackNormalFooter_setState:(class MJRefreshBackNormalFooter *self, int state)",41,0.51,1.40,0,24,80 82 85 103 109 112 116,"MJRefreshBackStateFooter_placeSubviews","MJRefreshBackStateFooter_placeSubviews{instance}.07dd32534b9ae4810921764ceac1540a",1,0,NONE,55,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,62,0,N,"void MJRefreshBackStateFooter_placeSubviews(class MJRefreshBackStateFooter *self)",9,0.67,0.95,0,8,62 64 66 70,"MJRefreshBackStateFooter_prepare","MJRefreshBackStateFooter_prepare{instance}.e12b6d29ae7cc426b54f69331c789d15",1,0,NONE,58,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,51,0,N,"void MJRefreshBackStateFooter_prepare(class MJRefreshBackStateFooter *self)",7,1.00,1.15,0,13,51 53 56 57 58 59 60,"MJRefreshBackStateFooter_setState:","MJRefreshBackStateFooter_setState:{instance}.0ffb3dd66c48270735110933d1f2f0d7",3,0,NONE,147,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,72,0,N,"void MJRefreshBackStateFooter_setState:(class MJRefreshBackStateFooter *self, int state)",10,1.00,1.08,0,11,72 74 77 78,"MJRefreshBackStateFooter_setTitle:forState:","MJRefreshBackStateFooter_setTitle:forState:{instance}.e6265b339a82b1b962fd6b7d372b38b4",1,0,NONE,75,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,39,0,N,"void MJRefreshBackStateFooter_setTitle:forState:(class MJRefreshBackStateFooter *self, class NSString *title, int state)",9,0.56,1.11,1,11,39 41 44,"MJRefreshBackStateFooter_stateLabel","MJRefreshBackStateFooter_stateLabel{instance}.671bdcb3c3052ca29a0160eca1c6b6bd",2,0,NONE,139,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,30,0,N,"class UILabel *MJRefreshBackStateFooter_stateLabel(class MJRefreshBackStateFooter *self)",12,1.00,0.85,4,2,30 32 33 35 36,"MJRefreshBackStateFooter_stateTitles","MJRefreshBackStateFooter_stateTitles{instance}.8c8d015f558a5b782cef16fa2a872de2",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,22,0,N,"class NSMutableDictionary *MJRefreshBackStateFooter_stateTitles(class MJRefreshBackStateFooter *self)",12,1.00,0.85,4,2,22 24 25 27 28,"MJRefreshBackStateFooter_titleForState:","MJRefreshBackStateFooter_titleForState:{instance}.6644d0fcdc32801821696c2a4d6f0aa8",2,0,NONE,59,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m,46,0,N,"class NSString *MJRefreshBackStateFooter_titleForState:(class MJRefreshBackStateFooter *self, int state)",3,1.00,0.78,0,5,46 47 48,"MJRefreshComponent_addObservers","MJRefreshComponent_addObservers{instance}.48ac3cc9007a3c8cbb6a15277c7db9ea",2,0,NONE,119,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,88,0,N,"void MJRefreshComponent_addObservers(class MJRefreshComponent *self)",7,1.00,0.85,1,5,88 90 91 92 93 94 95,"MJRefreshComponent_beginRefreshing","MJRefreshComponent_beginRefreshing{instance}.37e3b4491c03ca5070562df652ae4a3f",6,0,NONE,301,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,137,0,N,"void MJRefreshComponent_beginRefreshing(class MJRefreshComponent *self)",11,1.00,1.04,0,10,137 139 142 144 145 147 149 151,"MJRefreshComponent_drawRect:","MJRefreshComponent_drawRect:{instance}.5c9569babdce7fbc05fdb15778362755",2,0,NONE,56,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,77,0,N,"void MJRefreshComponent_drawRect:(class MJRefreshComponent *self, struct CGRect rect)",8,1.00,0.60,0,3,77 79 81 83 85,"MJRefreshComponent_endRefreshing","MJRefreshComponent_endRefreshing{instance}.2720081dcaca1ee01ca4ba03255da838",1,0,NONE,16,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,154,0,N,"void MJRefreshComponent_endRefreshing(class MJRefreshComponent *self)",3,1.00,0.30,0,1,154 156 157,"MJRefreshComponent_executeRefreshingCallback","MJRefreshComponent_executeRefreshingCallback{instance}.4f282c4379c6e540d10c12e54d80e390",2,0,NONE,80,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,202,0,N,"void MJRefreshComponent_executeRefreshingCallback(class MJRefreshComponent *self)",4,1.00,0.85,0,6,202 204 212,"MJRefreshComponent_initWithFrame:","MJRefreshComponent_initWithFrame:{instance}.dcc5043bc9d4cc86799bf33ff4f78bb3",1,0,NONE,52,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,21,0,N,"struct objc_object *MJRefreshComponent_initWithFrame:(class MJRefreshComponent *self, struct CGRect frame)",9,0.89,0.85,0,6,21 23 25 28 30 31,"MJRefreshComponent_isAutoChangeAlpha","MJRefreshComponent_isAutoChangeAlpha{instance}.d2580facd9584f5d1823586225276c0c",1,0,NONE,18,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,171,0,N,"_Bool MJRefreshComponent_isAutoChangeAlpha(class MJRefreshComponent *self)",3,1.00,0.30,0,1,171 173 174,"MJRefreshComponent_isRefreshing","MJRefreshComponent_isRefreshing{instance}.a3d1e918912f39baa99b419848f9d33b",1,0,NONE,22,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,160,0,N,"_Bool MJRefreshComponent_isRefreshing(class MJRefreshComponent *self)",3,1.00,0.78,4,1,160 162 163,"MJRefreshComponent_layoutSubviews","MJRefreshComponent_layoutSubviews{instance}.8098590c7287f2a2c27bd59d78a0452b",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,40,0,N,"void MJRefreshComponent_layoutSubviews(class MJRefreshComponent *self)",4,1.00,0.48,0,2,40 42 44 45,"MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:","MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:{instance}.5c79a9157e694b8877729d29e6accd4f",5,0,SYMOPS TIMEOUT (334),537,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,105,0,N,"void MJRefreshComponent_observeValueForKeyPath:ofObject:change:context:(class MJRefreshComponent *self, class NSString *keyPath, struct objc_object *object, class NSDictionary *change, void *context)",32,0.94,0.85,0,6,105 108 111 112 116 117 118 119 120 122,"MJRefreshComponent_placeSubviews","MJRefreshComponent_placeSubviews{instance}.73d06208ee35f85eb9d849aecd472416",1,0,NONE,6,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,47,0,N,"void MJRefreshComponent_placeSubviews(class MJRefreshComponent *self)",2,1.00,0.30,1,0,47,"MJRefreshComponent_prepare","MJRefreshComponent_prepare{instance}.38440e789285bd7781f72155c89e3f5a",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,33,0,N,"void MJRefreshComponent_prepare(class MJRefreshComponent *self)",4,1.00,0.70,1,3,33 36 37 38,"MJRefreshComponent_removeObservers","MJRefreshComponent_removeObservers{instance}.c9d911e52f725b43fc7b34f4a07b3923",1,0,NONE,52,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,97,0,N,"void MJRefreshComponent_removeObservers(class MJRefreshComponent *self)",6,1.00,0.78,1,4,97 99 100 101 102 103,"MJRefreshComponent_scrollViewContentOffsetDidChange:","MJRefreshComponent_scrollViewContentOffsetDidChange:{instance}.617caa7f28422a6417560a602082f5b8",1,0,NONE,8,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,124,0,N,"void MJRefreshComponent_scrollViewContentOffsetDidChange:(class MJRefreshComponent *self, class NSDictionary *change)",2,1.00,0.30,1,0,124,"MJRefreshComponent_scrollViewContentSizeDidChange:","MJRefreshComponent_scrollViewContentSizeDidChange:{instance}.e16f83d0096447be3224827fc19b9549",1,0,NONE,8,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,125,0,N,"void MJRefreshComponent_scrollViewContentSizeDidChange:(class MJRefreshComponent *self, class NSDictionary *change)",2,1.00,0.30,1,0,125,"MJRefreshComponent_scrollViewPanStateDidChange:","MJRefreshComponent_scrollViewPanStateDidChange:{instance}.d34301c5662a55086b39dd2ec566b5ad",1,0,NONE,8,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,126,0,N,"void MJRefreshComponent_scrollViewPanStateDidChange:(class MJRefreshComponent *self, class NSDictionary *change)",2,1.00,0.30,1,0,126,"MJRefreshComponent_setAutoChangeAlpha:","MJRefreshComponent_setAutoChangeAlpha:{instance}.a04c05493fc5ecf43d98b9924f8bc78c",3,0,NONE,64,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,166,0,N,"void MJRefreshComponent_setAutoChangeAlpha:(class MJRefreshComponent *self, _Bool autoChangeAlpha)",3,1.00,0.78,0,5,166 168 169,"MJRefreshComponent_setAutomaticallyChangeAlpha:","MJRefreshComponent_setAutomaticallyChangeAlpha:{instance}.4591244e561c565e45c21b89ff9610d4",3,0,NONE,122,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,176,0,N,"void MJRefreshComponent_setAutomaticallyChangeAlpha:(class MJRefreshComponent *self, _Bool automaticallyChangeAlpha)",13,1.00,0.78,1,4,176 178 180 182 183 185 187,"MJRefreshComponent_setPullingPercent:","MJRefreshComponent_setPullingPercent:{instance}.5755356ca5ccb563f50c75bba6db1e9d",3,0,NONE,110,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,190,0,N,"void MJRefreshComponent_setPullingPercent:(class MJRefreshComponent *self, double pullingPercent)",13,1.00,0.78,1,4,190 192 194 196 197 199,"MJRefreshComponent_setRefreshingTarget:refreshingAction:","MJRefreshComponent_setRefreshingTarget:refreshingAction:{instance}.d064af6f306c53b4158833f0f020408a",1,0,NONE,30,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,130,0,N,"void MJRefreshComponent_setRefreshingTarget:refreshingAction:(class MJRefreshComponent *self, struct objc_object *target, void *action)",4,1.00,0.48,0,2,130 132 133 134,"MJRefreshComponent_willMoveToSuperview:","MJRefreshComponent_willMoveToSuperview:{instance}.7f13a46585df11309a3efe2ded73b3e8",1,0,NONE,167,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,49,0,N,"void MJRefreshComponent_willMoveToSuperview:(class MJRefreshComponent *self, class UIView *newSuperview)",25,0.32,1.23,0,16,49 51 54 57 59 75,"MJRefreshFooter_endRefreshingWithNoMoreData","MJRefreshFooter_endRefreshingWithNoMoreData{instance}.7cebeaf3e25d576c2293600605c1d5dd",0,0,NONE,3,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,60,0,N,"void MJRefreshFooter_endRefreshingWithNoMoreData(class MJRefreshFooter *self)",3,0.00,0.48,1,1,,"MJRefreshFooter_footerWithRefreshingBlock:","MJRefreshFooter_footerWithRefreshingBlock:{class}.7b0806c0686d1afa44b5fed238c938ea",0,0,NONE,10,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,18,0,N,"struct objc_object *MJRefreshFooter_footerWithRefreshingBlock:(_fn_ (*refreshingBlock))",5,0.00,0.48,0,2,,"MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:","MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:{class}.1e0bbbdfa84d1cb2fec223b55831736b",0,0,NONE,34,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,24,0,N,"struct objc_object *MJRefreshFooter_footerWithRefreshingTarget:refreshingAction:(struct objc_object *target, void *action)",5,0.00,0.48,0,2,,"MJRefreshFooter_noticeNoMoreData","MJRefreshFooter_noticeNoMoreData{instance}.494f0af619d71dbb29db8dfc8f282251",1,0,NONE,16,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,65,0,N,"void MJRefreshFooter_noticeNoMoreData(class MJRefreshFooter *self)",3,1.00,0.48,0,2,65 67 68,"MJRefreshFooter_prepare","MJRefreshFooter_prepare{instance}.ddd00b0bdc007d8acb701df2df7655ca",0,0,NONE,8,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,32,0,N,"void MJRefreshFooter_prepare(class MJRefreshFooter *self)",5,0.00,0.60,0,3,,"MJRefreshFooter_resetNoMoreData","MJRefreshFooter_resetNoMoreData{instance}.b274245415c7498741c88078022d456f",0,0,NONE,3,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,70,0,N,"void MJRefreshFooter_resetNoMoreData(class MJRefreshFooter *self)",3,0.00,0.30,0,1,,"MJRefreshFooter_willMoveToSuperview:","MJRefreshFooter_willMoveToSuperview:{instance}.3e71353e4d67175789d2dd970e67fd37",2,0,NONE,155,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,43,0,N,"void MJRefreshFooter_willMoveToSuperview:(class MJRefreshFooter *self, class UIView *newSuperview)",11,1.00,0.90,0,7,43 45 47 49 50 57,"MJRefreshGifHeader_gifView","MJRefreshGifHeader_gifView{instance}.f27c0323d39ba73d7475591753b0d820",2,0,NONE,152,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,23,0,N,"class UIImageView *MJRefreshGifHeader_gifView(class MJRefreshGifHeader *self)",13,1.00,0.78,3,2,23 25 26 27 29 30,"MJRefreshGifHeader_placeSubviews","MJRefreshGifHeader_placeSubviews{instance}.3b12f3d808f6e873748f71aeeae3b0eb",1,0,NONE,55,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,82,0,N,"void MJRefreshGifHeader_placeSubviews(class MJRefreshGifHeader *self)",16,0.38,1.18,0,14,82 84 86 95,"MJRefreshGifHeader_setImages:duration:forState:","MJRefreshGifHeader_setImages:duration:forState:{instance}.c9ff89babbdd988caa30a42380238d0f",1,0,NONE,99,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,49,0,N,"void MJRefreshGifHeader_setImages:duration:forState:(class MJRefreshGifHeader *self, class NSArray *images, double duration, int state)",15,0.33,1.15,1,12,49 51 61,"MJRefreshGifHeader_setImages:forState:","MJRefreshGifHeader_setImages:forState:{instance}.eedc47d9f24c22cecd1d33d19b2da587",1,0,NONE,33,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,63,0,N,"void MJRefreshGifHeader_setImages:forState:(class MJRefreshGifHeader *self, class NSArray *images, int state)",3,1.00,1.18,0,14,63 65 66,"MJRefreshGifHeader_setPullingPercent:","MJRefreshGifHeader_setPullingPercent:{instance}.09714a93b584cd6ad3c07c560b76c445",0,0,NONE,66,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,69,0,N,"void MJRefreshGifHeader_setPullingPercent:(class MJRefreshGifHeader *self, double pullingPercent)",20,0.00,1.18,0,14,,"MJRefreshGifHeader_setState:","MJRefreshGifHeader_setState:{instance}.81dabe1e4914cef626e0420acceaa1fa",0,0,SYMOPS TIMEOUT (334),334,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,97,0,N,"void MJRefreshGifHeader_setState:(class MJRefreshGifHeader *self, int state)",36,0.00,1.32,0,20,,"MJRefreshGifHeader_stateDurations","MJRefreshGifHeader_stateDurations{instance}.ee55fb0d6525e622971f502c74682d20",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,40,0,N,"class NSMutableDictionary *MJRefreshGifHeader_stateDurations(class MJRefreshGifHeader *self)",12,1.00,0.78,3,2,40 42 43 45 46,"MJRefreshGifHeader_stateImages","MJRefreshGifHeader_stateImages{instance}.c45aa4d25429518b434a1b8d924d07b3",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m,32,0,N,"class NSMutableDictionary *MJRefreshGifHeader_stateImages(class MJRefreshGifHeader *self)",12,1.00,0.85,4,2,32 34 35 37 38,"MJRefreshHeader_drawRect:","MJRefreshHeader_drawRect:{instance}.c3e57b4a302b533c30bf09ca94992915",1,0,NONE,20,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,136,0,N,"void MJRefreshHeader_drawRect:(class MJRefreshHeader *self, struct CGRect rect)",3,1.00,0.30,0,1,136 138 141,"MJRefreshHeader_endRefreshing","MJRefreshHeader_endRefreshing{instance}.fb3fecfe4e2f8b20f48a86c39ec8d2c8",1,0,NONE,119,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,144,0,N,"void MJRefreshHeader_endRefreshing(class MJRefreshHeader *self)",9,1.00,0.70,0,4,144 146 147 151 153,"MJRefreshHeader_headerWithRefreshingBlock:","MJRefreshHeader_headerWithRefreshingBlock:{class}.86bd7d9042726fde59582daf33cccd26",0,0,NONE,10,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,18,0,N,"struct objc_object *MJRefreshHeader_headerWithRefreshingBlock:(_fn_ (*refreshingBlock))",5,0.00,0.48,0,2,,"MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:","MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:{class}.38704964b164af751351ca0df311361c",0,0,NONE,34,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,24,0,N,"struct objc_object *MJRefreshHeader_headerWithRefreshingTarget:refreshingAction:(struct objc_object *target, void *action)",5,0.00,0.48,0,2,,"MJRefreshHeader_lastUpdatedTime","MJRefreshHeader_lastUpdatedTime{instance}.2a89276f34032f5c83485ead73d73c79",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,155,0,N,"class NSDate *MJRefreshHeader_lastUpdatedTime(class MJRefreshHeader *self)",3,1.00,0.60,0,3,155 157 158,"MJRefreshHeader_placeSubviews","MJRefreshHeader_placeSubviews{instance}.1feae4d44bd11e658f4aca7d5d6cc6cb",1,0,NONE,32,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,43,0,N,"void MJRefreshHeader_placeSubviews(class MJRefreshHeader *self)",4,1.00,0.70,0,4,43 45 48 49,"MJRefreshHeader_prepare","MJRefreshHeader_prepare{instance}.f8820581ac423aeb157abb616851572d",0,0,NONE,25,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,32,0,N,"void MJRefreshHeader_prepare(class MJRefreshHeader *self)",5,0.00,0.60,0,3,,"MJRefreshHeader_scrollViewContentOffsetDidChange:","MJRefreshHeader_scrollViewContentOffsetDidChange:{instance}.052321827b6bd024a37e6ccf4c6f5eaa",0,0,SYMOPS TIMEOUT (334),334,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,51,0,N,"void MJRefreshHeader_scrollViewContentOffsetDidChange:(class MJRefreshHeader *self, class NSDictionary *change)",70,0.00,1.51,0,31,,"MJRefreshHeader_setState:","MJRefreshHeader_setState:{instance}.613dbd07b62ad0844ea350e1c213bfec",4,0,NONE,251,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,101,0,N,"void MJRefreshHeader_setState:(class MJRefreshHeader *self, int state)",26,0.92,1.40,1,23,101 103 106 107 110 111 114 119 122 123 130 134,"MJRefreshNormalHeader_arrowView","MJRefreshNormalHeader_arrowView{instance}.3c9cde775fac361e9e6fbd5ed8ee6d86",2,0,NONE,207,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,20,0,N,"class UIImageView *MJRefreshNormalHeader_arrowView(class MJRefreshNormalHeader *self)",20,0.90,1.04,5,5,20 22 23 24 25 27 28,"MJRefreshNormalHeader_loadingView","MJRefreshNormalHeader_loadingView{instance}.bac4283eefad58aa66ec42809991591a",2,0,NONE,160,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,30,0,N,"class UIActivityIndicatorView *MJRefreshNormalHeader_loadingView(class MJRefreshNormalHeader *self)",14,1.00,0.95,4,4,30 32 33 34 35 37 38,"MJRefreshNormalHeader_placeSubviews","MJRefreshNormalHeader_placeSubviews{instance}.1637f8c1509d5ff960a7ee2b01a93543",0,0,NONE,9,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,57,0,N,"void MJRefreshNormalHeader_placeSubviews(class MJRefreshNormalHeader *self)",27,0.00,1.36,0,22,,"MJRefreshNormalHeader_prepare","MJRefreshNormalHeader_prepare{instance}.c5161195985077e841f425b250b31545",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,50,0,N,"void MJRefreshNormalHeader_prepare(class MJRefreshNormalHeader *self)",4,1.00,0.70,0,4,50 52 54 55,"MJRefreshNormalHeader_setActivityIndicatorViewStyle:","MJRefreshNormalHeader_setActivityIndicatorViewStyle:{instance}.f54ee85457d5aef8dcad8becafed4dbe",1,0,NONE,32,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,41,0,N,"void MJRefreshNormalHeader_setActivityIndicatorViewStyle:(class MJRefreshNormalHeader *self, int activityIndicatorViewStyle)",5,1.00,0.60,1,2,41 43 45 46 47,"MJRefreshNormalHeader_setState:","MJRefreshNormalHeader_setState:{instance}.cf4cc9b8ba9cb613d7b7656d100e6a5c",2,0,NONE,179,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,81,0,N,"void MJRefreshNormalHeader_setState:(class MJRefreshNormalHeader *self, int state)",36,0.50,1.40,0,24,81 83 86 107 113 118,"MJRefreshStateHeader_currentCalendar","MJRefreshStateHeader_currentCalendar{instance}.8a5d265e54d2287dcf9ab73daf03a0db",1,0,NONE,78,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,57,0,N,"class NSCalendar *MJRefreshStateHeader_currentCalendar(class MJRefreshStateHeader *self)",8,1.00,0.78,2,3,57 58 59 61 62,"MJRefreshStateHeader_lastUpdatedTimeLabel","MJRefreshStateHeader_lastUpdatedTimeLabel{instance}.39c3adf46f0e72fe1ca7bdb144690d58",2,0,NONE,139,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,40,0,N,"class UILabel *MJRefreshStateHeader_lastUpdatedTimeLabel(class MJRefreshStateHeader *self)",12,1.00,0.78,3,2,40 42 43 45 46,"MJRefreshStateHeader_placeSubviews","MJRefreshStateHeader_placeSubviews{instance}.3551b50672d8958430e0714f4a86608a",2,0,NONE,360,1,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,120,0,N,"void MJRefreshStateHeader_placeSubviews(class MJRefreshStateHeader *self)",33,0.42,1.26,0,17,120 122 124 126 128 130 149,"MJRefreshStateHeader_prepare","MJRefreshStateHeader_prepare{instance}.f22a66a2819564c00d25b26a8008dc49",1,0,NONE,48,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,110,0,N,"void MJRefreshStateHeader_prepare(class MJRefreshStateHeader *self)",6,1.00,1.15,0,13,110 112 115 116 117 118,"MJRefreshStateHeader_setLastUpdatedTimeKey:","MJRefreshStateHeader_setLastUpdatedTimeKey:{instance}.49b3e932b043bc723eadea72e523c08a",0,0,SYMOPS TIMEOUT (334),334,1,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,65,0,N,"void MJRefreshStateHeader_setLastUpdatedTimeKey:(class MJRefreshStateHeader *self, class NSString *lastUpdatedTimeKey)",37,0.00,1.38,1,22,,"MJRefreshStateHeader_setState:","MJRefreshStateHeader_setState:{instance}.9e5202b000baef8593570a086f6041cc",3,0,NONE,167,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,151,0,N,"void MJRefreshStateHeader_setState:(class MJRefreshStateHeader *self, int state)",11,1.00,1.52,0,32,151 153 156 159 160,"MJRefreshStateHeader_setTitle:forState:","MJRefreshStateHeader_setTitle:forState:{instance}.7245f932111276c34a890fcd85654763",1,0,NONE,75,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,49,0,N,"void MJRefreshStateHeader_setTitle:forState:(class MJRefreshStateHeader *self, class NSString *title, int state)",9,0.56,1.11,1,11,49 51 54,"MJRefreshStateHeader_stateLabel","MJRefreshStateHeader_stateLabel{instance}.0d68c4cd4f8dbfeb7f2359f4d961670f",2,0,NONE,139,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,32,0,N,"class UILabel *MJRefreshStateHeader_stateLabel(class MJRefreshStateHeader *self)",12,1.00,0.85,4,2,32 34 35 37 38,"MJRefreshStateHeader_stateTitles","MJRefreshStateHeader_stateTitles{instance}.38ba9a44aa4289fe8e20bd9863f71a73",2,0,NONE,127,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m,24,0,N,"class NSMutableDictionary *MJRefreshStateHeader_stateTitles(class MJRefreshStateHeader *self)",12,1.00,0.78,3,2,24 26 27 29 30,"NSObject_exchangeClassMethod1:method2:","NSObject_exchangeClassMethod1:method2:{class}.71d689a434ca09b8cb8f74bbec7f4eb5",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,22,0,N,"void NSObject_exchangeClassMethod1:method2:(void *method1, void *method2)",3,1.00,0.48,0,2,22 24 25,"NSObject_exchangeInstanceMethod1:method2:","NSObject_exchangeInstanceMethod1:method2:{class}.96dfacd3a3ff34cf35523d85905b2d24",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,17,0,N,"void NSObject_exchangeInstanceMethod1:method2:(void *method1, void *method2)",3,1.00,0.48,0,2,17 19 20,"UICollectionView_load","UICollectionView_load{class}.d1e03b913041c5304ea6e6aaae62516c",1,0,NONE,10,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,152,0,N,"void UICollectionView_load()",3,1.00,0.30,0,1,152 154 155,"UICollectionView_mj_reloadData","UICollectionView_mj_reloadData{instance}.9bef8e95c2259d92fdae989582bb1f01",1,0,NONE,23,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,157,0,N,"void UICollectionView_mj_reloadData(class UICollectionView *self)",4,0.00,1.08,1,10,,"UILabel_label","UILabel_label{class}.afa07640ba686955a2a7362d25bc45b7",1,0,NONE,64,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,216,0,N,"struct objc_object *UILabel_label()",9,1.00,1.00,0,9,216 218 219 220 221 222 223 224 225,"UIScrollView_executeReloadDataBlock","UIScrollView_executeReloadDataBlock{instance}.2ca85f7effafbea15ae2c2975b285598",1,0,NONE,62,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,129,0,N,"void UIScrollView_executeReloadDataBlock(class UIScrollView *self)",19,0.47,1.04,2,8,129 131 132,"UIScrollView_footer","UIScrollView_footer{instance}.8fce697ac57901aefeb1dacc2f5a47fb",1,0,NONE,22,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,81,0,N,"class MJRefreshFooter *UIScrollView_footer(class UIScrollView *self)",3,1.00,0.48,0,2,81 83 84,"UIScrollView_header","UIScrollView_header{instance}.e36f42d4e2603c64553db7a0edc46a00",1,0,NONE,22,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,91,0,N,"class MJRefreshHeader *UIScrollView_header(class UIScrollView *self)",3,1.00,0.48,0,2,91 93 94,"UIScrollView_mj_contentH","UIScrollView_mj_contentH{instance}.24036d4daf4502909755d50e306cf8aa",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,106,0,N,"double UIScrollView_mj_contentH(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_contentW","UIScrollView_mj_contentW{instance}.b233414ab82901bfa5e9c481f02eed57",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,94,0,N,"double UIScrollView_mj_contentW(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_footer","UIScrollView_mj_footer{instance}.ba19ff126339a1f9cc565424123dd04a",1,0,NONE,20,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,70,0,N,"class MJRefreshFooter *UIScrollView_mj_footer(class UIScrollView *self)",3,1.00,0.70,3,1,70 72 73,"UIScrollView_mj_header","UIScrollView_mj_header{instance}.de4dca3362b06a6fcebf0d4f8ea6605d",1,0,NONE,20,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,48,0,N,"class MJRefreshHeader *UIScrollView_mj_header(class UIScrollView *self)",3,1.00,0.70,3,1,48 50 51,"UIScrollView_mj_insetB","UIScrollView_mj_insetB{instance}.027c674f176050465f25d28555c82310",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,34,0,N,"double UIScrollView_mj_insetB(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_insetL","UIScrollView_mj_insetL{instance}.69019a4b689dc5e9480034298613a0c4",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,46,0,N,"double UIScrollView_mj_insetL(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_insetR","UIScrollView_mj_insetR{instance}.8115b31217137fcbfb89f6bc0a2b4fbb",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,58,0,N,"double UIScrollView_mj_insetR(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_insetT","UIScrollView_mj_insetT{instance}.dac71a98dc5d026ebd267231dbdea13e",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,22,0,N,"double UIScrollView_mj_insetT(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_offsetX","UIScrollView_mj_offsetX{instance}.add36016215f1fb4cf2e3cdb7c52da44",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,70,0,N,"double UIScrollView_mj_offsetX(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_offsetY","UIScrollView_mj_offsetY{instance}.d3262116c9f7c7ee5e0b4e48645e0584",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,82,0,N,"double UIScrollView_mj_offsetY(class UIScrollView *self)",3,0.00,0.30,0,1,,"UIScrollView_mj_reloadDataBlock","UIScrollView_mj_reloadDataBlock{instance}.768a89e8546301059a84c1fcc484d254",1,0,NONE,18,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,124,0,N,"_fn_ (*UIScrollView_mj_reloadDataBlock)(class UIScrollView *self)",3,1.00,0.70,3,1,124 126 127,"UIScrollView_mj_totalDataCount","UIScrollView_mj_totalDataCount{instance}.6c960100dbafbe2ab276237e1d1d821d",0,0,SYMOPS TIMEOUT (334),334,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,97,0,N,"long UIScrollView_mj_totalDataCount(class UIScrollView *self)",28,0.00,0.95,3,5,,"UIScrollView_setFooter:","UIScrollView_setFooter:{instance}.228b084c44c3768d2822fc3e5ea603c3",1,0,NONE,22,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,76,0,N,"void UIScrollView_setFooter:(class UIScrollView *self, class MJRefreshFooter *footer)",3,1.00,1.00,0,9,76 78 79,"UIScrollView_setHeader:","UIScrollView_setHeader:{instance}.0e813252b26bad8d7194457a9c6ba149",1,0,NONE,22,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,86,0,N,"void UIScrollView_setHeader:(class UIScrollView *self, class MJRefreshHeader *header)",3,1.00,1.00,0,9,86 88 89,"UIScrollView_setMj_contentH:","UIScrollView_setMj_contentH:{instance}.834d14f06ceb43250beab703d0ccfc0a",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,99,0,N,"void UIScrollView_setMj_contentH:(class UIScrollView *self, double mj_contentH)",5,0.00,0.48,0,2,,"UIScrollView_setMj_contentW:","UIScrollView_setMj_contentW:{instance}.e5a6e3a2cd405961dfb5c0d27d352b8d",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,87,0,N,"void UIScrollView_setMj_contentW:(class UIScrollView *self, double mj_contentW)",5,0.00,0.48,0,2,,"UIScrollView_setMj_footer:","UIScrollView_setMj_footer:{instance}.2cd77804053e8f9f52d938b68b3a588d",1,0,NONE,86,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,55,0,N,"void UIScrollView_setMj_footer:(class UIScrollView *self, class MJRefreshFooter *mj_footer)",11,1.00,1.00,1,8,55 57 59 60 63 64 65 66 68,"UIScrollView_setMj_header:","UIScrollView_setMj_header:{instance}.bd1cfdba85638094043a7255cd38d0ea",1,0,NONE,86,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,33,0,N,"void UIScrollView_setMj_header:(class UIScrollView *self, class MJRefreshHeader *mj_header)",11,1.00,1.00,1,8,33 35 37 38 41 42 43 44 46,"UIScrollView_setMj_insetB:","UIScrollView_setMj_insetB:{instance}.5a71cb186a3ec20d90f8bd47b9dac47d",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,27,0,N,"void UIScrollView_setMj_insetB:(class UIScrollView *self, double mj_insetB)",5,0.00,0.48,0,2,,"UIScrollView_setMj_insetL:","UIScrollView_setMj_insetL:{instance}.e64529e7d174d17a7bec9ddea732217e",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,39,0,N,"void UIScrollView_setMj_insetL:(class UIScrollView *self, double mj_insetL)",5,0.00,0.48,0,2,,"UIScrollView_setMj_insetR:","UIScrollView_setMj_insetR:{instance}.12aee9fa466171ca35f2b72511ac6b2c",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,51,0,N,"void UIScrollView_setMj_insetR:(class UIScrollView *self, double mj_insetR)",5,0.00,0.48,0,2,,"UIScrollView_setMj_insetT:","UIScrollView_setMj_insetT:{instance}.48d5cd4609dcdd5cff9a9c427036d431",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,15,0,N,"void UIScrollView_setMj_insetT:(class UIScrollView *self, double mj_insetT)",5,0.00,0.48,0,2,,"UIScrollView_setMj_offsetX:","UIScrollView_setMj_offsetX:{instance}.e4bac092fb29b1d9c57a97f035e115ee",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,63,0,N,"void UIScrollView_setMj_offsetX:(class UIScrollView *self, double mj_offsetX)",5,0.00,0.48,0,2,,"UIScrollView_setMj_offsetY:","UIScrollView_setMj_offsetY:{instance}.b20c4dbf093bd5a03175f1fa88401744",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m,75,0,N,"void UIScrollView_setMj_offsetY:(class UIScrollView *self, double mj_offsetY)",5,0.00,0.48,0,2,,"UIScrollView_setMj_reloadDataBlock:","UIScrollView_setMj_reloadDataBlock:{instance}.76ba198ea223a97ea4f70bb1841542da",1,0,NONE,40,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,117,0,N,"void UIScrollView_setMj_reloadDataBlock:(class UIScrollView *self, _fn_ (*mj_reloadDataBlock))",5,1.00,0.70,0,4,117 119 120 121 122,"UITableView_load","UITableView_load{class}.84c274c5438215fdde4219bec1285f66",1,0,NONE,10,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,137,0,N,"void UITableView_load()",3,1.00,0.30,0,1,137 139 140,"UITableView_mj_reloadData","UITableView_mj_reloadData{instance}.8779ce6889d187a3a60ecee233b45a4d",1,0,NONE,23,0,Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m,142,0,N,"void UITableView_mj_reloadData(class UITableView *self)",4,0.00,1.08,1,10,,"UIView_mj_h","UIView_mj_h{instance}.ee1ab511f6d44208e5e19010a90366d1",0,0,NONE,15,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,56,0,N,"double UIView_mj_h(class UIView *self)",3,0.00,0.30,0,1,,"UIView_mj_origin","UIView_mj_origin{instance}.2920f5c507be706665b2cd16dee7bd48",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,80,0,N,"struct CGPoint UIView_mj_origin(class UIView *self)",3,0.00,0.30,0,1,,"UIView_mj_size","UIView_mj_size{instance}.1a606f4737e097976c18bab3c2937c8a",0,0,NONE,14,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,68,0,N,"struct CGSize UIView_mj_size(class UIView *self)",3,0.00,0.30,0,1,,"UIView_mj_w","UIView_mj_w{instance}.40d5044cb68b9af45a11d48702981b38",0,0,NONE,15,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,44,0,N,"double UIView_mj_w(class UIView *self)",3,0.00,0.30,0,1,,"UIView_mj_x","UIView_mj_x{instance}.68420f3d9cbd6af5459acfe1f5ff8969",0,0,NONE,15,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,20,0,N,"double UIView_mj_x(class UIView *self)",3,0.00,0.30,0,1,,"UIView_mj_y","UIView_mj_y{instance}.5ee543392493c0ac7824532a483f2ecb",0,0,NONE,15,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,32,0,N,"double UIView_mj_y(class UIView *self)",3,0.00,0.30,0,1,,"UIView_setMj_h:","UIView_setMj_h:{instance}.e3c6b5717320a086e65063710338abec",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,49,0,N,"void UIView_setMj_h:(class UIView *self, double mj_h)",5,0.00,0.48,0,2,,"UIView_setMj_origin:","UIView_setMj_origin:{instance}.172127b30d28a15fd36a401db0f22d36",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,73,0,N,"void UIView_setMj_origin:(class UIView *self, struct CGPoint mj_origin)",5,0.00,0.48,0,2,,"UIView_setMj_size:","UIView_setMj_size:{instance}.489fcf45b45f241ec7b42263ac5af8d5",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,61,0,N,"void UIView_setMj_size:(class UIView *self, struct CGSize mj_size)",5,0.00,0.48,0,2,,"UIView_setMj_w:","UIView_setMj_w:{instance}.f49ebde9182999565f9e96ae7c6f508c",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,37,0,N,"void UIView_setMj_w:(class UIView *self, double mj_w)",5,0.00,0.48,0,2,,"UIView_setMj_x:","UIView_setMj_x:{instance}.055a79745f644de01d6f4b9ebac4198d",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,13,0,N,"void UIView_setMj_x:(class UIView *self, double mj_x)",5,0.00,0.48,0,2,,"UIView_setMj_y:","UIView_setMj_y:{instance}.48f4dc71b9e738f0a240f9bf0482deb2",0,0,NONE,13,0,Pods/MJRefresh/MJRefresh/UIView+MJExtension.m,25,0,N,"void UIView_setMj_y:(class UIView *self, double mj_y)",5,0.00,0.48,0,2,,"__objc_anonymous_block_HMSegmentedControl_drawRect:______1","__objc_anonymous_block_HMSegmentedControl_drawRect:______1.ac00e0b31d310500f8d60cbc5fe837d4",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,280,887,N,"void __objc_anonymous_block_HMSegmentedControl_drawRect:______1(class HMSegmentedControl *self, struct CGRect oldRect, struct objc_object *titleString, unsigned long idx, _Bool *stop)",59,0.00,1.80,1,61,,"__objc_anonymous_block_HMSegmentedControl_drawRect:______2","__objc_anonymous_block_HMSegmentedControl_drawRect:______2.7bdf1a5d4cc5e5ba3c504eddfeac85db",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,340,887,N,"void __objc_anonymous_block_HMSegmentedControl_drawRect:______2(class HMSegmentedControl *self, struct objc_object *iconImage, unsigned long idx, _Bool *stop)",41,0.00,1.48,1,28,,"__objc_anonymous_block_HMSegmentedControl_drawRect:______3","__objc_anonymous_block_HMSegmentedControl_drawRect:______3.471cb3b49d3a9cab6761cbe3ec1d252c",0,0,SYMOPS TIMEOUT (334),334,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,375,887,N,"void __objc_anonymous_block_HMSegmentedControl_drawRect:______3(class HMSegmentedControl *self, struct objc_object *iconImage, unsigned long idx, _Bool *stop)",65,0.00,1.80,1,61,,"__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4","__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4.429f1ffb7ec31f9a9c435111bc406f9c",0,0,NONE,71,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,622,887,N,"void __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______4(class HMSegmentedControl *self, struct objc_object *titleString, unsigned long idx, _Bool *stop)",10,0.00,1.46,4,24,,"__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5","__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5.a41e476bf4b88c8e9f84999dce16c732",0,0,NONE,122,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,629,887,N,"void __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______5(class HMSegmentedControl *self, class NSMutableArray *mutableSegmentWidths, struct objc_object *titleString, unsigned long idx, _Bool *stop)",4,0.00,1.46,4,24,,"__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6","__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6.dee26246d5e256df34bdf8b19b84cde7",0,0,NONE,71,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,641,887,N,"void __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______6(class HMSegmentedControl *self, struct objc_object *titleString, unsigned long idx, _Bool *stop)",10,0.00,1.46,4,24,,"__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7","__objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7.269aa7e8b4620722a518c763475e9f4f",0,0,NONE,95,0,Coderpursue/ThidParty/HMSegmentedControl/HMSegmentedControl.m,649,887,N,"void __objc_anonymous_block_HMSegmentedControl_updateSegmentsRects______7(class HMSegmentedControl *self, int i, class NSMutableArray *mutableSegmentWidths, struct objc_object *titleString, unsigned long idx, _Bool *stop)",13,0.00,1.51,4,27,,"__objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______1","__objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______.409368d69a6b2c45cfe2d573b5fa37c4",1,0,NONE,44,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,414,1033,N,"void __objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______1(_fn_ (*block), class MBProgressHUD *self)",5,1.00,1.53,4,29,414 415 416 419,"__objc_anonymous_block_MJRefreshAutoFooter_setState:______1","__objc_anonymous_block_MJRefreshAutoFooter_setState:______1.aedcdd766515748b002173dc90ceff19",3,0,NONE,42,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m,110,0,N,"void __objc_anonymous_block_MJRefreshAutoFooter_setState:______1(class MJRefreshAutoFooter *self)",3,1.00,0.60,2,1,110 111 112,"__objc_anonymous_block_MJRefreshBackFooter_setState:______1","__objc_anonymous_block_MJRefreshBackFooter_setState:______1.cfa28ad1b71153eff2ab2df148a9350c",0,0,NONE,3,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,91,0,N,"void __objc_anonymous_block_MJRefreshBackFooter_setState:______1(class MJRefreshBackFooter *self)",8,0.00,0.95,2,6,,"__objc_anonymous_block_MJRefreshBackFooter_setState:______2","__objc_anonymous_block_MJRefreshBackFooter_setState:______2.8de7ef77687044e540ac043423b63632",4,0,NONE,64,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,96,0,N,"void __objc_anonymous_block_MJRefreshBackFooter_setState:______2(class MJRefreshBackFooter *self, _Bool finished)",3,1.00,0.60,2,1,96 97 98,"__objc_anonymous_block_MJRefreshBackFooter_setState:______3","__objc_anonymous_block_MJRefreshBackFooter_setState:______3.b2c868550af9354ff62f3e4fc3848162",0,0,NONE,5,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,110,0,N,"void __objc_anonymous_block_MJRefreshBackFooter_setState:______3(class MJRefreshBackFooter *self)",12,0.00,1.15,2,11,,"__objc_anonymous_block_MJRefreshBackFooter_setState:______4","__objc_anonymous_block_MJRefreshBackFooter_setState:______4.ab8afe779bff8ed6270e2d15f642c4fe",3,0,NONE,46,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m,119,0,N,"void __objc_anonymous_block_MJRefreshBackFooter_setState:______4(class MJRefreshBackFooter *self, _Bool finished)",3,1.00,0.60,2,1,119 120 121,"__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1","__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1.7522c36b71d1ab187151be463eff1098",2,0,NONE,44,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,88,0,N,"void __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______1(class MJRefreshBackNormalFooter *self)",3,1.00,0.90,1,6,88 89 90,"__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2","__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2.c0b565ccdc6399fe31cea3f918a63d77",1,0,NONE,64,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,90,0,N,"void __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______2(class MJRefreshBackNormalFooter *self, _Bool finished)",5,1.00,1.18,1,13,90 91 92 94 95,"__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3","__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3.96e6d447a9ecb2dbbf0a435a452011fe",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,99,0,N,"void __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______3(class MJRefreshBackNormalFooter *self)",3,1.00,1.00,1,8,99 100 101,"__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4","__objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4.fc556a200c10aeee80632a7de7f14568",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m,106,0,N,"void __objc_anonymous_block_MJRefreshBackNormalFooter_setState:______4(class MJRefreshBackNormalFooter *self)",3,1.00,0.95,1,7,106 107 108,"__objc_anonymous_block_MJRefreshComponent_beginRefreshing______1","__objc_anonymous_block_MJRefreshComponent_beginRefreshing______1.21a03cc40ef29fea9c999c520e574567",2,0,NONE,25,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,139,0,N,"void __objc_anonymous_block_MJRefreshComponent_beginRefreshing______1(class MJRefreshComponent *self)",3,1.00,0.48,1,1,139 140 141,"__objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2","__objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2.ac25df20ab117714920dc4367d5da310",5,0,NONE,271,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m,204,0,N,"void __objc_anonymous_block_MJRefreshComponent_executeRefreshingCallback______2(class MJRefreshComponent *self)",12,1.00,0.85,1,5,204 205 206 208 209 211,"__objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1","__objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1.06e600200d9f03e2ae58f19c069e87ed",2,0,NONE,39,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m,50,0,N,"void __objc_anonymous_block_MJRefreshFooter_willMoveToSuperview:______1(class MJRefreshFooter *self, long totalDataCount)",7,0.71,0.60,1,2,50 51 54,"__objc_anonymous_block_MJRefreshHeader_setState:______1","__objc_anonymous_block_MJRefreshHeader_setState:______1.d3a54c1db631c871b31b389567116d06",5,0,NONE,175,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,114,0,N,"void __objc_anonymous_block_MJRefreshHeader_setState:______1(class MJRefreshHeader *self)",8,1.00,0.95,2,6,114 115 118 119,"__objc_anonymous_block_MJRefreshHeader_setState:______2","__objc_anonymous_block_MJRefreshHeader_setState:______2.76071b0d0f5e67c93ff3d61cf3a3789e",4,0,NONE,64,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,119,0,N,"void __objc_anonymous_block_MJRefreshHeader_setState:______2(class MJRefreshHeader *self, _Bool finished)",3,1.00,0.60,2,1,119 120 121,"__objc_anonymous_block_MJRefreshHeader_setState:______3","__objc_anonymous_block_MJRefreshHeader_setState:______3.8532e74d34f685982ae68b06d10fd8df",0,0,NONE,67,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,123,0,N,"void __objc_anonymous_block_MJRefreshHeader_setState:______3(class MJRefreshHeader *self)",5,0.00,0.90,2,5,,"__objc_anonymous_block_MJRefreshHeader_setState:______4","__objc_anonymous_block_MJRefreshHeader_setState:______4.7d0f7a7a3eb581c034485e549b090838",3,0,NONE,46,0,Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m,130,0,N,"void __objc_anonymous_block_MJRefreshHeader_setState:______4(class MJRefreshHeader *self, _Bool finished)",3,1.00,0.60,2,1,130 131 132,"__objc_anonymous_block_MJRefreshNormalHeader_setState:______1","__objc_anonymous_block_MJRefreshNormalHeader_setState:______1.13050930c71724b7417ba383bb55c321",2,0,NONE,44,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,90,0,N,"void __objc_anonymous_block_MJRefreshNormalHeader_setState:______1(class MJRefreshNormalHeader *self)",3,1.00,0.90,1,6,90 91 92,"__objc_anonymous_block_MJRefreshNormalHeader_setState:______2","__objc_anonymous_block_MJRefreshNormalHeader_setState:______2.1b4d0233230d9fceaa325a329806fc0d",2,0,NONE,69,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,92,0,N,"void __objc_anonymous_block_MJRefreshNormalHeader_setState:______2(class MJRefreshNormalHeader *self, _Bool finished)",10,0.50,1.20,1,14,92 94 99,"__objc_anonymous_block_MJRefreshNormalHeader_setState:______3","__objc_anonymous_block_MJRefreshNormalHeader_setState:______3.696a392bca56dbc6cc8c2c8a2eb661b9",1,0,NONE,24,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,103,0,N,"void __objc_anonymous_block_MJRefreshNormalHeader_setState:______3(class MJRefreshNormalHeader *self)",3,1.00,0.95,1,7,103 104 105,"__objc_anonymous_block_MJRefreshNormalHeader_setState:______4","__objc_anonymous_block_MJRefreshNormalHeader_setState:______4.2249f9bd76235aa33803cf6005991b20",1,0,NONE,26,0,Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m,110,0,N,"void __objc_anonymous_block_MJRefreshNormalHeader_setState:______4(class MJRefreshNormalHeader *self)",3,1.00,1.00,1,8,110 111 112,"__objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______1______2","__objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue.c2d18021879fb88e6826d66a2b095c56",1,0,NONE,14,0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,416,1033,N,"void __objc_anonymous_block___objc_anonymous_block_MBProgressHUD_showAnimated:whileExecutingBlock:onQueue:completionBlock:______1______2(class MBProgressHUD *self)",3,1.00,1.53,5,28,416 417 418, ================================================ FILE: BeeFun/infer-out/report.csv ================================================ class,kind,type,qualifier,severity,line,procedure,procedure_id,file,trace,key,qualifier_tags,hash,bug_id,always_report,advice ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar showStarted of an atomic property at line 267, column 32. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,267,MBProgressHUD_hide:,MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,267,899444905,16,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar showStarted of an atomic property at line 268, column 64. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,268,MBProgressHUD_hide:,MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,268,899444905,17,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar taskInProgress of an atomic property at line 291, column 6. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,291,MBProgressHUD_handleGraceTimer:,MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,291,956117499,15,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 313, column 18. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,313,MBProgressHUD_showUsingAnimation:,MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,313,70924649,46,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 315, column 25. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,315,MBProgressHUD_showUsingAnimation:,MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,315,70924649,48,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 324, column 56. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,324,MBProgressHUD_showUsingAnimation:,MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,324,70924649,45,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 324, column 7. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,324,MBProgressHUD_showUsingAnimation:,MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,324,70924649,47,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar showStarted of an atomic property at line 336, column 18. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,336,MBProgressHUD_hideUsingAnimation:,MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,336,337261897,21,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 343, column 7. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,343,MBProgressHUD_hideUsingAnimation:,MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,343,337261897,20,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar animationType of an atomic property at line 345, column 14. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,345,MBProgressHUD_hideUsingAnimation:,MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,345,337261897,22,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar removeFromSuperViewOnHide of an atomic property at line 367, column 6. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,367,MBProgressHUD_done,MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,367,333218123,9,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar delegate of an atomic property at line 376, column 7. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,376,MBProgressHUD_done,MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,376,333218123,8,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar delegate of an atomic property at line 377, column 4. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,377,MBProgressHUD_done,MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,377,333218123,10,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar taskInProgress of an atomic property at line 439, column 2. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,439,MBProgressHUD_cleanUp,MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,439,730255395,7,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 478, column 30. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,478,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,478,424832482,57,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 479, column 27. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,479,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,479,424832482,51,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 481, column 6. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,481,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,481,424832482,76,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 484, column 5. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,484,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,484,424832482,59,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 487, column 32. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,487,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,487,424832482,67,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 488, column 21. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,488,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,488,424832482,74,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 491, column 31. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,491,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,491,424832482,75,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 494, column 11. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,494,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,494,424832482,73,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 496, column 4. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,496,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,496,424832482,55,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 498, column 20. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,498,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,498,424832482,56,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 500, column 51. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,500,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,500,424832482,58,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 500, column 11. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,500,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,500,424832482,66,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 503, column 5. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,503,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,503,424832482,64,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 505, column 21. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,505,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,505,424832482,65,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 507, column 7. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,507,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,507,424832482,68,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 508, column 28. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,508,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,508,424832482,72,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 510, column 27. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,510,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,510,424832482,52,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 511, column 27. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,511,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,511,424832482,62,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 513, column 11. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,513,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,513,424832482,53,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar customView of an atomic property at line 513, column 50. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,513,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,513,424832482,63,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 513, column 64. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,513,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,513,424832482,70,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 515, column 4. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,515,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,515,424832482,69,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar customView of an atomic property at line 516, column 20. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,516,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,516,424832482,54,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 517, column 20. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,517,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,517,424832482,71,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar mode of an atomic property at line 518, column 13. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,518,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,518,424832482,61,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 519, column 4. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,519,MBProgressHUD_updateIndicators,MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,519,424832482,60,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 537, column 45. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,537,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,537,683457559,40,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 540, column 22. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,540,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,540,683457559,24,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 553, column 83. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,553,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,553,683457559,36,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 562, column 25. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,562,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,562,683457559,41,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 563, column 26. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,563,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,563,683457559,42,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar yOffset of an atomic property at line 566, column 81. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,566,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,566,683457559,25,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 566, column 72. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,566,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,566,683457559,33,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar xOffset of an atomic property at line 567, column 17. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,567,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,567,683457559,37,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 570, column 2. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,570,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,570,683457559,30,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar square of an atomic property at line 593, column 6. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,593,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,593,683457559,35,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 595, column 38. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,595,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,595,683457559,27,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar margin of an atomic property at line 598, column 39. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,598,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,598,683457559,34,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar minSize of an atomic property at line 602, column 24. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,602,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,602,683457559,32,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar minSize of an atomic property at line 603, column 21. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,603,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,603,683457559,38,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar minSize of an atomic property at line 605, column 25. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,605,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,605,683457559,39,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar minSize of an atomic property at line 606, column 22. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,606,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,606,683457559,28,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar size of an atomic property at line 609, column 2. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,609,MBProgressHUD_layoutSubviews,MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,609,683457559,26,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar size of an atomic property at line 649, column 30. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,649,MBProgressHUD_drawRect:,MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,649,281153261,11,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar size of an atomic property at line 650, column 72. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,650,MBProgressHUD_drawRect:,MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,650,281153261,12,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar size of an atomic property at line 650, column 9. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,650,MBProgressHUD_drawRect:,MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,650,281153261,13,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar size of an atomic property at line 650, column 84. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,650,MBProgressHUD_drawRect:,MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,650,281153261,14,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 708, column 8. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,708,MBProgressHUD_updateUIForKeypath:,MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,708,522726456,78,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar indicator of an atomic property at line 709, column 9. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,709,MBProgressHUD_updateUIForKeypath:,MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,709,522726456,77,false, ,WARNING,DIRECT_ATOMIC_PROPERTY_ACCESS,"Direct access to ivar progress of an atomic property at line 709, column 30. Accessing an ivar of an atomic property makes the property nonatomic",MEDIUM,709,MBProgressHUD_updateUIForKeypath:,MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e,Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m,"{""trace"":[{""level"":0,""filename"":"""",""line_number"":-1,""description"":"""",""node_tags"":[]}]}",173877444,709,522726456,79,false, ================================================ FILE: BeeFun/infer-out/report.json ================================================ [ { "key": 173877444, "kind": "WARNING", "hash": 899444905, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "267" } ], "line": 267, "procedure_id": "MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507", "procedure": "MBProgressHUD_hide:", "qualifier": "Direct access to ivar showStarted of an atomic property at line 267, column 32. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 899444905, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "268" } ], "line": 268, "procedure_id": "MBProgressHUD_hide:{instance}.9f087e822370af64645764e8180cf507", "procedure": "MBProgressHUD_hide:", "qualifier": "Direct access to ivar showStarted of an atomic property at line 268, column 64. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 956117499, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "291" } ], "line": 291, "procedure_id": "MBProgressHUD_handleGraceTimer:{instance}.1b8680a1326602baf44976543198fed9", "procedure": "MBProgressHUD_handleGraceTimer:", "qualifier": "Direct access to ivar taskInProgress of an atomic property at line 291, column 6. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 70924649, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "313" } ], "line": 313, "procedure_id": "MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be", "procedure": "MBProgressHUD_showUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 313, column 18. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 70924649, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "315" } ], "line": 315, "procedure_id": "MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be", "procedure": "MBProgressHUD_showUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 315, column 25. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 70924649, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "324" } ], "line": 324, "procedure_id": "MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be", "procedure": "MBProgressHUD_showUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 324, column 56. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 70924649, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "324" } ], "line": 324, "procedure_id": "MBProgressHUD_showUsingAnimation:{instance}.9401eaed7b787b815229a4f8ec3357be", "procedure": "MBProgressHUD_showUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 324, column 7. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 337261897, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "336" } ], "line": 336, "procedure_id": "MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03", "procedure": "MBProgressHUD_hideUsingAnimation:", "qualifier": "Direct access to ivar showStarted of an atomic property at line 336, column 18. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 337261897, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "343" } ], "line": 343, "procedure_id": "MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03", "procedure": "MBProgressHUD_hideUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 343, column 7. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 337261897, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "345" } ], "line": 345, "procedure_id": "MBProgressHUD_hideUsingAnimation:{instance}.7d9068a738fef2e9a6e234f592d77b03", "procedure": "MBProgressHUD_hideUsingAnimation:", "qualifier": "Direct access to ivar animationType of an atomic property at line 345, column 14. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 333218123, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "367" } ], "line": 367, "procedure_id": "MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a", "procedure": "MBProgressHUD_done", "qualifier": "Direct access to ivar removeFromSuperViewOnHide of an atomic property at line 367, column 6. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 333218123, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "376" } ], "line": 376, "procedure_id": "MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a", "procedure": "MBProgressHUD_done", "qualifier": "Direct access to ivar delegate of an atomic property at line 376, column 7. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 333218123, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "377" } ], "line": 377, "procedure_id": "MBProgressHUD_done{instance}.72390a40ef044120f3206ce23838c81a", "procedure": "MBProgressHUD_done", "qualifier": "Direct access to ivar delegate of an atomic property at line 377, column 4. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 730255395, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "439" } ], "line": 439, "procedure_id": "MBProgressHUD_cleanUp{instance}.f88f2551df8f2874a1f623e3c7d179a3", "procedure": "MBProgressHUD_cleanUp", "qualifier": "Direct access to ivar taskInProgress of an atomic property at line 439, column 2. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "478" } ], "line": 478, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 478, column 30. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "479" } ], "line": 479, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 479, column 27. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "481" } ], "line": 481, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 481, column 6. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "484" } ], "line": 484, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 484, column 5. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "487" } ], "line": 487, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 487, column 32. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "488" } ], "line": 488, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 488, column 21. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "491" } ], "line": 491, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 491, column 31. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "494" } ], "line": 494, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 494, column 11. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "496" } ], "line": 496, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 496, column 4. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "498" } ], "line": 498, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 498, column 20. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "500" } ], "line": 500, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 500, column 51. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "500" } ], "line": 500, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 500, column 11. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "503" } ], "line": 503, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 503, column 5. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "505" } ], "line": 505, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 505, column 21. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "507" } ], "line": 507, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 507, column 7. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "508" } ], "line": 508, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 508, column 28. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "510" } ], "line": 510, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 510, column 27. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "511" } ], "line": 511, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 511, column 27. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "513" } ], "line": 513, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 513, column 11. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "513" } ], "line": 513, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar customView of an atomic property at line 513, column 50. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "513" } ], "line": 513, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 513, column 64. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "515" } ], "line": 515, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 515, column 4. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "516" } ], "line": 516, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar customView of an atomic property at line 516, column 20. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "517" } ], "line": 517, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 517, column 20. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "518" } ], "line": 518, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar mode of an atomic property at line 518, column 13. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 424832482, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "519" } ], "line": 519, "procedure_id": "MBProgressHUD_updateIndicators{instance}.a3986e584873e64cd5fec235462f12b3", "procedure": "MBProgressHUD_updateIndicators", "qualifier": "Direct access to ivar indicator of an atomic property at line 519, column 4. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "537" } ], "line": 537, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 537, column 45. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "540" } ], "line": 540, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar indicator of an atomic property at line 540, column 22. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "553" } ], "line": 553, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 553, column 83. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "562" } ], "line": 562, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 562, column 25. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "563" } ], "line": 563, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 563, column 26. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "566" } ], "line": 566, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar yOffset of an atomic property at line 566, column 81. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "566" } ], "line": 566, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 566, column 72. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "567" } ], "line": 567, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar xOffset of an atomic property at line 567, column 17. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "570" } ], "line": 570, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar indicator of an atomic property at line 570, column 2. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "593" } ], "line": 593, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar square of an atomic property at line 593, column 6. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "595" } ], "line": 595, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 595, column 38. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "598" } ], "line": 598, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar margin of an atomic property at line 598, column 39. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "602" } ], "line": 602, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar minSize of an atomic property at line 602, column 24. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "603" } ], "line": 603, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar minSize of an atomic property at line 603, column 21. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "605" } ], "line": 605, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar minSize of an atomic property at line 605, column 25. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "606" } ], "line": 606, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar minSize of an atomic property at line 606, column 22. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 683457559, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "609" } ], "line": 609, "procedure_id": "MBProgressHUD_layoutSubviews{instance}.b1b30a767241a72169fad46125b80ce0", "procedure": "MBProgressHUD_layoutSubviews", "qualifier": "Direct access to ivar size of an atomic property at line 609, column 2. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 281153261, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "649" } ], "line": 649, "procedure_id": "MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604", "procedure": "MBProgressHUD_drawRect:", "qualifier": "Direct access to ivar size of an atomic property at line 649, column 30. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 281153261, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "650" } ], "line": 650, "procedure_id": "MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604", "procedure": "MBProgressHUD_drawRect:", "qualifier": "Direct access to ivar size of an atomic property at line 650, column 72. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 281153261, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "650" } ], "line": 650, "procedure_id": "MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604", "procedure": "MBProgressHUD_drawRect:", "qualifier": "Direct access to ivar size of an atomic property at line 650, column 9. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 281153261, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "650" } ], "line": 650, "procedure_id": "MBProgressHUD_drawRect:{instance}.d021496ab2c89b5e6977af3d98e6a604", "procedure": "MBProgressHUD_drawRect:", "qualifier": "Direct access to ivar size of an atomic property at line 650, column 84. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 522726456, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "708" } ], "line": 708, "procedure_id": "MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e", "procedure": "MBProgressHUD_updateUIForKeypath:", "qualifier": "Direct access to ivar indicator of an atomic property at line 708, column 8. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 522726456, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "709" } ], "line": 709, "procedure_id": "MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e", "procedure": "MBProgressHUD_updateUIForKeypath:", "qualifier": "Direct access to ivar indicator of an atomic property at line 709, column 9. Accessing an ivar of an atomic property makes the property nonatomic" }, { "key": 173877444, "kind": "WARNING", "hash": 522726456, "severity": "MEDIUM", "bug_trace": [ { "node_tags": [], "line_number": -1, "filename": "", "description": "", "level": 0 } ], "bug_class": "", "bug_type": "DIRECT_ATOMIC_PROPERTY_ACCESS", "file": "Coderpursue/ThidParty/MBProgressHUD/MBProgressHUD.m", "qualifier_tags": [ { "tag": "line", "value": "709" } ], "line": 709, "procedure_id": "MBProgressHUD_updateUIForKeypath:{instance}.7f3963efa7a8ac2719bfd99007bd6b6e", "procedure": "MBProgressHUD_updateUIForKeypath:", "qualifier": "Direct access to ivar progress of an atomic property at line 709, column 30. Accessing an ivar of an atomic property makes the property nonatomic" } ] ================================================ FILE: BeeFun/infer-out/sources/HMSegmentedControl.m.3ada2ea9130f9a3bb1eba0413ee61fd2 ================================================ // // HMSegmentedControl.m // HMSegmentedControl // // Created by Hesham Abd-Elmegid on 23/12/12. // Copyright (c) 2012-2015 Hesham Abd-Elmegid. All rights reserved. // #import "HMSegmentedControl.h" #import #import @interface HMScrollView : UIScrollView @end @interface HMSegmentedControl () @property (nonatomic, strong) CALayer *selectionIndicatorStripLayer; @property (nonatomic, strong) CALayer *selectionIndicatorBoxLayer; @property (nonatomic, strong) CALayer *selectionIndicatorArrowLayer; @property (nonatomic, readwrite) CGFloat segmentWidth; @property (nonatomic, readwrite) NSArray *segmentWidthsArray; @property (nonatomic, strong) HMScrollView *scrollView; @end @implementation HMScrollView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) { [self.nextResponder touchesBegan:touches withEvent:event]; } else { [super touchesBegan:touches withEvent:event]; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if (!self.dragging) { [self.nextResponder touchesMoved:touches withEvent:event]; } else{ [super touchesMoved:touches withEvent:event]; } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) { [self.nextResponder touchesEnded:touches withEvent:event]; } else { [super touchesEnded:touches withEvent:event]; } } @end @implementation HMSegmentedControl - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self commonInit]; } return self; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self commonInit]; } return self; } - (id)initWithSectionTitles:(NSArray *)sectiontitles { self = [self initWithFrame:CGRectZero]; if (self) { [self commonInit]; self.sectionTitles = sectiontitles; self.type = HMSegmentedControlTypeText; } return self; } - (id)initWithSectionImages:(NSArray*)sectionImages sectionSelectedImages:(NSArray*)sectionSelectedImages { self = [super initWithFrame:CGRectZero]; if (self) { [self commonInit]; self.sectionImages = sectionImages; self.sectionSelectedImages = sectionSelectedImages; self.type = HMSegmentedControlTypeImages; } return self; } - (instancetype)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages titlesForSections:(NSArray *)sectiontitles { self = [super initWithFrame:CGRectZero]; if (self) { [self commonInit]; if (sectionImages.count != sectiontitles.count) { [NSException raise:NSRangeException format:@"***%s: Images bounds (%ld) Dont match Title bounds (%ld)", sel_getName(_cmd), (unsigned long)sectionImages.count, (unsigned long)sectiontitles.count]; } self.sectionImages = sectionImages; self.sectionSelectedImages = sectionSelectedImages; self.sectionTitles = sectiontitles; self.type = HMSegmentedControlTypeTextImages; } return self; } - (void)awakeFromNib { [super awakeFromNib]; self.segmentWidth = 0.0f; [self commonInit]; } - (void)commonInit { self.scrollView = [[HMScrollView alloc] init]; self.scrollView.scrollsToTop = NO; self.scrollView.showsVerticalScrollIndicator = NO; self.scrollView.showsHorizontalScrollIndicator = NO; [self addSubview:self.scrollView]; _backgroundColor = [UIColor whiteColor]; self.opaque = NO; _selectionIndicatorColor = [UIColor colorWithRed:52.0f/255.0f green:181.0f/255.0f blue:229.0f/255.0f alpha:1.0f]; self.selectedSegmentIndex = 0; self.segmentEdgeInset = UIEdgeInsetsMake(0, 5, 0, 5); self.selectionIndicatorHeight = 5.0f; self.selectionIndicatorEdgeInsets = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f); self.selectionStyle = HMSegmentedControlSelectionStyleTextWidthStripe; self.selectionIndicatorLocation = HMSegmentedControlSelectionIndicatorLocationUp; self.segmentWidthStyle = HMSegmentedControlSegmentWidthStyleFixed; self.userDraggable = YES; self.touchEnabled = YES; self.verticalDividerEnabled = NO; self.type = HMSegmentedControlTypeText; self.verticalDividerWidth = 1.0f; _verticalDividerColor = [UIColor blackColor]; self.borderColor = [UIColor blackColor]; self.borderWidth = 1.0f; self.shouldAnimateUserSelection = YES; self.selectionIndicatorArrowLayer = [CALayer layer]; self.selectionIndicatorStripLayer = [CALayer layer]; self.selectionIndicatorBoxLayer = [CALayer layer]; self.selectionIndicatorBoxLayer.opacity = self.selectionIndicatorBoxOpacity; self.selectionIndicatorBoxLayer.borderWidth = 1.0f; self.selectionIndicatorBoxOpacity = 0.2; self.contentMode = UIViewContentModeRedraw; } - (void)layoutSubviews { [super layoutSubviews]; [self updateSegmentsRects]; } - (void)setFrame:(CGRect)frame { [super setFrame:frame]; [self updateSegmentsRects]; } - (void)setSectionTitles:(NSArray *)sectionTitles { _sectionTitles = sectionTitles; [self setNeedsLayout]; } - (void)setSectionImages:(NSArray *)sectionImages { _sectionImages = sectionImages; [self setNeedsLayout]; } - (void)setSelectionIndicatorLocation:(HMSegmentedControlSelectionIndicatorLocation)selectionIndicatorLocation { _selectionIndicatorLocation = selectionIndicatorLocation; if (selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationNone) { self.selectionIndicatorHeight = 0.0f; } } - (void)setSelectionIndicatorBoxOpacity:(CGFloat)selectionIndicatorBoxOpacity { _selectionIndicatorBoxOpacity = selectionIndicatorBoxOpacity; self.selectionIndicatorBoxLayer.opacity = _selectionIndicatorBoxOpacity; } - (void)setSegmentWidthStyle:(HMSegmentedControlSegmentWidthStyle)segmentWidthStyle { // Force HMSegmentedControlSegmentWidthStyleFixed when type is HMSegmentedControlTypeImages. if (self.type == HMSegmentedControlTypeImages) { _segmentWidthStyle = HMSegmentedControlSegmentWidthStyleFixed; } else { _segmentWidthStyle = segmentWidthStyle; } } - (void)setBorderType:(HMSegmentedControlBorderType)borderType { _borderType = borderType; [self setNeedsDisplay]; } #pragma mark - Drawing - (CGSize)measureTitleAtIndex:(NSUInteger)index { id title = self.sectionTitles[index]; CGSize size = CGSizeZero; BOOL selected = (index == self.selectedSegmentIndex) ? YES : NO; if ([title isKindOfClass:[NSString class]] && !self.titleFormatter) { NSDictionary *titleAttrs = selected ? [self resultingSelectedTitleTextAttributes] : [self resultingTitleTextAttributes]; size = [(NSString *)title sizeWithAttributes:titleAttrs]; } else if ([title isKindOfClass:[NSString class]] && self.titleFormatter) { size = [self.titleFormatter(self, title, index, selected) size]; } else if ([title isKindOfClass:[NSAttributedString class]]) { size = [(NSAttributedString *)title size]; } else { NSAssert(title == nil, @"Unexpected type of segment title: %@", [title class]); size = CGSizeZero; } return CGRectIntegral((CGRect){CGPointZero, size}).size; } - (NSAttributedString *)attributedTitleAtIndex:(NSUInteger)index { id title = self.sectionTitles[index]; BOOL selected = (index == self.selectedSegmentIndex) ? YES : NO; if ([title isKindOfClass:[NSAttributedString class]]) { return (NSAttributedString *)title; } else if (!self.titleFormatter) { NSDictionary *titleAttrs = selected ? [self resultingSelectedTitleTextAttributes] : [self resultingTitleTextAttributes]; // the color should be cast to CGColor in order to avoid invalid context on iOS7 UIColor *titleColor = titleAttrs[NSForegroundColorAttributeName]; if (titleColor) { NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:titleAttrs]; dict[NSForegroundColorAttributeName] = (id)titleColor.CGColor; titleAttrs = [NSDictionary dictionaryWithDictionary:dict]; } return [[NSAttributedString alloc] initWithString:(NSString *)title attributes:titleAttrs]; } else { return self.titleFormatter(self, title, index, selected); } } - (void)drawRect:(CGRect)rect { [self.backgroundColor setFill]; UIRectFill([self bounds]); self.selectionIndicatorArrowLayer.backgroundColor = self.selectionIndicatorColor.CGColor; self.selectionIndicatorStripLayer.backgroundColor = self.selectionIndicatorColor.CGColor; self.selectionIndicatorBoxLayer.backgroundColor = self.selectionIndicatorColor.CGColor; self.selectionIndicatorBoxLayer.borderColor = self.selectionIndicatorColor.CGColor; // Remove all sublayers to avoid drawing images over existing ones self.scrollView.layer.sublayers = nil; CGRect oldRect = rect; if (self.type == HMSegmentedControlTypeText) { [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = 0; CGFloat stringHeight = 0; CGSize size = [self measureTitleAtIndex:idx]; stringWidth = size.width; stringHeight = size.height; CGRect rectDiv, fullRect; // Text inside the CATextLayer will appear blurry unless the rect values are rounded BOOL locationUp = (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationUp); BOOL selectionStyleNotBox = (self.selectionStyle != HMSegmentedControlSelectionStyleBox); CGFloat y = roundf((CGRectGetHeight(self.frame) - selectionStyleNotBox * self.selectionIndicatorHeight) / 2 - stringHeight / 2 + self.selectionIndicatorHeight * locationUp); CGRect rect; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { rect = CGRectMake((self.segmentWidth * idx) + (self.segmentWidth - stringWidth) / 2, y, stringWidth, stringHeight); rectDiv = CGRectMake((self.segmentWidth * idx) - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 2, self.verticalDividerWidth, self.frame.size.height - (self.selectionIndicatorHeight * 4)); fullRect = CGRectMake(self.segmentWidth * idx, 0, self.segmentWidth, oldRect.size.height); } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { // When we are drawing dynamic widths, we need to loop the widths array to calculate the xOffset CGFloat xOffset = 0; NSInteger i = 0; for (NSNumber *width in self.segmentWidthsArray) { if (idx == i) break; xOffset = xOffset + [width floatValue]; i++; } CGFloat widthForIndex = [[self.segmentWidthsArray objectAtIndex:idx] floatValue]; rect = CGRectMake(xOffset, y, widthForIndex, stringHeight); fullRect = CGRectMake(self.segmentWidth * idx, 0, widthForIndex, oldRect.size.height); rectDiv = CGRectMake(xOffset - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 2, self.verticalDividerWidth, self.frame.size.height - (self.selectionIndicatorHeight * 4)); } // Fix rect position/size to avoid blurry labels rect = CGRectMake(ceilf(rect.origin.x), ceilf(rect.origin.y), ceilf(rect.size.width), ceilf(rect.size.height)); CATextLayer *titleLayer = [CATextLayer layer]; titleLayer.frame = rect; titleLayer.alignmentMode = kCAAlignmentCenter; titleLayer.truncationMode = kCATruncationEnd; titleLayer.string = [self attributedTitleAtIndex:idx]; titleLayer.contentsScale = [[UIScreen mainScreen] scale]; [self.scrollView.layer addSublayer:titleLayer]; // Vertical Divider if (self.isVerticalDividerEnabled && idx > 0) { CALayer *verticalDividerLayer = [CALayer layer]; verticalDividerLayer.frame = rectDiv; verticalDividerLayer.backgroundColor = self.verticalDividerColor.CGColor; [self.scrollView.layer addSublayer:verticalDividerLayer]; } [self addBackgroundAndBorderLayerWithRect:fullRect]; }]; } else if (self.type == HMSegmentedControlTypeImages) { [self.sectionImages enumerateObjectsUsingBlock:^(id iconImage, NSUInteger idx, BOOL *stop) { UIImage *icon = iconImage; CGFloat imageWidth = icon.size.width; CGFloat imageHeight = icon.size.height; CGFloat y = roundf(CGRectGetHeight(self.frame) - self.selectionIndicatorHeight) / 2 - imageHeight / 2 + ((self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationUp) ? self.selectionIndicatorHeight : 0); CGFloat x = self.segmentWidth * idx + (self.segmentWidth - imageWidth)/2.0f; CGRect rect = CGRectMake(x, y, imageWidth, imageHeight); CALayer *imageLayer = [CALayer layer]; imageLayer.frame = rect; if (self.selectedSegmentIndex == idx) { if (self.sectionSelectedImages) { UIImage *highlightIcon = [self.sectionSelectedImages objectAtIndex:idx]; imageLayer.contents = (id)highlightIcon.CGImage; } else { imageLayer.contents = (id)icon.CGImage; } } else { imageLayer.contents = (id)icon.CGImage; } [self.scrollView.layer addSublayer:imageLayer]; // Vertical Divider if (self.isVerticalDividerEnabled && idx>0) { CALayer *verticalDividerLayer = [CALayer layer]; verticalDividerLayer.frame = CGRectMake((self.segmentWidth * idx) - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 2, self.verticalDividerWidth, self.frame.size.height-(self.selectionIndicatorHeight * 4)); verticalDividerLayer.backgroundColor = self.verticalDividerColor.CGColor; [self.scrollView.layer addSublayer:verticalDividerLayer]; } [self addBackgroundAndBorderLayerWithRect:rect]; }]; } else if (self.type == HMSegmentedControlTypeTextImages){ [self.sectionImages enumerateObjectsUsingBlock:^(id iconImage, NSUInteger idx, BOOL *stop) { UIImage *icon = iconImage; CGFloat imageWidth = icon.size.width; CGFloat imageHeight = icon.size.height; CGFloat stringHeight = [self measureTitleAtIndex:idx].height; CGFloat yOffset = roundf(((CGRectGetHeight(self.frame) - self.selectionIndicatorHeight) / 2) - (stringHeight / 2)); CGFloat imageXOffset = self.segmentEdgeInset.left; // Start with edge inset CGFloat textXOffset = self.segmentEdgeInset.left; CGFloat textWidth = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { imageXOffset = (self.segmentWidth * idx) + (self.segmentWidth / 2.0f) - (imageWidth / 2.0f); textXOffset = self.segmentWidth * idx; textWidth = self.segmentWidth; } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { // When we are drawing dynamic widths, we need to loop the widths array to calculate the xOffset CGFloat xOffset = 0; NSInteger i = 0; for (NSNumber *width in self.segmentWidthsArray) { if (idx == i) { break; } xOffset = xOffset + [width floatValue]; i++; } imageXOffset = xOffset + ([self.segmentWidthsArray[idx] floatValue] / 2.0f) - (imageWidth / 2.0f); //(self.segmentWidth / 2.0f) - (imageWidth / 2.0f) textXOffset = xOffset; textWidth = [self.segmentWidthsArray[idx] floatValue]; } CGFloat imageYOffset = roundf((CGRectGetHeight(self.frame) - self.selectionIndicatorHeight) / 2.0f); CGRect imageRect = CGRectMake(imageXOffset, imageYOffset, imageWidth, imageHeight); CGRect textRect = CGRectMake(textXOffset, yOffset, textWidth, stringHeight); // Fix rect position/size to avoid blurry labels textRect = CGRectMake(ceilf(textRect.origin.x), ceilf(textRect.origin.y), ceilf(textRect.size.width), ceilf(textRect.size.height)); CATextLayer *titleLayer = [CATextLayer layer]; titleLayer.frame = textRect; titleLayer.alignmentMode = kCAAlignmentCenter; titleLayer.string = [self attributedTitleAtIndex:idx]; titleLayer.truncationMode = kCATruncationEnd; CALayer *imageLayer = [CALayer layer]; imageLayer.frame = imageRect; if (self.selectedSegmentIndex == idx) { if (self.sectionSelectedImages) { UIImage *highlightIcon = [self.sectionSelectedImages objectAtIndex:idx]; imageLayer.contents = (id)highlightIcon.CGImage; } else { imageLayer.contents = (id)icon.CGImage; } } else { imageLayer.contents = (id)icon.CGImage; } [self.scrollView.layer addSublayer:imageLayer]; titleLayer.contentsScale = [[UIScreen mainScreen] scale]; [self.scrollView.layer addSublayer:titleLayer]; [self addBackgroundAndBorderLayerWithRect:imageRect]; }]; } // Add the selection indicators if (self.selectedSegmentIndex != HMSegmentedControlNoSegment) { if (self.selectionStyle == HMSegmentedControlSelectionStyleArrow) { if (!self.selectionIndicatorArrowLayer.superlayer) { [self setArrowFrame]; [self.scrollView.layer addSublayer:self.selectionIndicatorArrowLayer]; } } else { if (!self.selectionIndicatorStripLayer.superlayer) { self.selectionIndicatorStripLayer.frame = [self frameForSelectionIndicator]; [self.scrollView.layer addSublayer:self.selectionIndicatorStripLayer]; if (self.selectionStyle == HMSegmentedControlSelectionStyleBox && !self.selectionIndicatorBoxLayer.superlayer) { self.selectionIndicatorBoxLayer.frame = [self frameForFillerSelectionIndicator]; [self.scrollView.layer insertSublayer:self.selectionIndicatorBoxLayer atIndex:0]; } } } } } - (void)addBackgroundAndBorderLayerWithRect:(CGRect)fullRect { // Background layer CALayer *backgroundLayer = [CALayer layer]; backgroundLayer.frame = fullRect; [self.scrollView.layer insertSublayer:backgroundLayer atIndex:0]; // Border layer if (self.borderType & HMSegmentedControlBorderTypeTop) { CALayer *borderLayer = [CALayer layer]; borderLayer.frame = CGRectMake(0, 0, fullRect.size.width, self.borderWidth); borderLayer.backgroundColor = self.borderColor.CGColor; [backgroundLayer addSublayer: borderLayer]; } if (self.borderType & HMSegmentedControlBorderTypeLeft) { CALayer *borderLayer = [CALayer layer]; borderLayer.frame = CGRectMake(0, 0, self.borderWidth, fullRect.size.height); borderLayer.backgroundColor = self.borderColor.CGColor; [backgroundLayer addSublayer: borderLayer]; } if (self.borderType & HMSegmentedControlBorderTypeBottom) { CALayer *borderLayer = [CALayer layer]; borderLayer.frame = CGRectMake(0, fullRect.size.height - self.borderWidth, fullRect.size.width, self.borderWidth); borderLayer.backgroundColor = self.borderColor.CGColor; [backgroundLayer addSublayer: borderLayer]; } if (self.borderType & HMSegmentedControlBorderTypeRight) { CALayer *borderLayer = [CALayer layer]; borderLayer.frame = CGRectMake(fullRect.size.width - self.borderWidth, 0, self.borderWidth, fullRect.size.height); borderLayer.backgroundColor = self.borderColor.CGColor; [backgroundLayer addSublayer: borderLayer]; } } - (void)setArrowFrame { self.selectionIndicatorArrowLayer.frame = [self frameForSelectionIndicator]; self.selectionIndicatorArrowLayer.mask = nil; UIBezierPath *arrowPath = [UIBezierPath bezierPath]; CGPoint p1 = CGPointZero; CGPoint p2 = CGPointZero; CGPoint p3 = CGPointZero; if (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationDown) { p1 = CGPointMake(self.selectionIndicatorArrowLayer.bounds.size.width / 2, 0); p2 = CGPointMake(0, self.selectionIndicatorArrowLayer.bounds.size.height); p3 = CGPointMake(self.selectionIndicatorArrowLayer.bounds.size.width, self.selectionIndicatorArrowLayer.bounds.size.height); } if (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationUp) { p1 = CGPointMake(self.selectionIndicatorArrowLayer.bounds.size.width / 2, self.selectionIndicatorArrowLayer.bounds.size.height); p2 = CGPointMake(self.selectionIndicatorArrowLayer.bounds.size.width, 0); p3 = CGPointMake(0, 0); } [arrowPath moveToPoint:p1]; [arrowPath addLineToPoint:p2]; [arrowPath addLineToPoint:p3]; [arrowPath closePath]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = self.selectionIndicatorArrowLayer.bounds; maskLayer.path = arrowPath.CGPath; self.selectionIndicatorArrowLayer.mask = maskLayer; } - (CGRect)frameForSelectionIndicator { CGFloat indicatorYOffset = 0.0f; if (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationDown) { indicatorYOffset = self.bounds.size.height - self.selectionIndicatorHeight + self.selectionIndicatorEdgeInsets.bottom; } if (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationUp) { indicatorYOffset = self.selectionIndicatorEdgeInsets.top; } CGFloat sectionWidth = 0.0f; if (self.type == HMSegmentedControlTypeText) { CGFloat stringWidth = [self measureTitleAtIndex:self.selectedSegmentIndex].width; sectionWidth = stringWidth; } else if (self.type == HMSegmentedControlTypeImages) { UIImage *sectionImage = [self.sectionImages objectAtIndex:self.selectedSegmentIndex]; CGFloat imageWidth = sectionImage.size.width; sectionWidth = imageWidth; } else if (self.type == HMSegmentedControlTypeTextImages) { CGFloat stringWidth = [self measureTitleAtIndex:self.selectedSegmentIndex].width; UIImage *sectionImage = [self.sectionImages objectAtIndex:self.selectedSegmentIndex]; CGFloat imageWidth = sectionImage.size.width; sectionWidth = MAX(stringWidth, imageWidth); } if (self.selectionStyle == HMSegmentedControlSelectionStyleArrow) { CGFloat widthToEndOfSelectedSegment = (self.segmentWidth * self.selectedSegmentIndex) + self.segmentWidth; CGFloat widthToStartOfSelectedIndex = (self.segmentWidth * self.selectedSegmentIndex); CGFloat x = widthToStartOfSelectedIndex + ((widthToEndOfSelectedSegment - widthToStartOfSelectedIndex) / 2) - (self.selectionIndicatorHeight/2); return CGRectMake(x - (self.selectionIndicatorHeight / 2), indicatorYOffset, self.selectionIndicatorHeight * 2, self.selectionIndicatorHeight); } else { if (self.selectionStyle == HMSegmentedControlSelectionStyleTextWidthStripe && sectionWidth <= self.segmentWidth && self.segmentWidthStyle != HMSegmentedControlSegmentWidthStyleDynamic) { CGFloat widthToEndOfSelectedSegment = (self.segmentWidth * self.selectedSegmentIndex) + self.segmentWidth; CGFloat widthToStartOfSelectedIndex = (self.segmentWidth * self.selectedSegmentIndex); CGFloat x = ((widthToEndOfSelectedSegment - widthToStartOfSelectedIndex) / 2) + (widthToStartOfSelectedIndex - sectionWidth / 2); return CGRectMake(x + self.selectionIndicatorEdgeInsets.left, indicatorYOffset, sectionWidth - self.selectionIndicatorEdgeInsets.right, self.selectionIndicatorHeight); } else { if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { CGFloat selectedSegmentOffset = 0.0f; NSInteger i = 0; for (NSNumber *width in self.segmentWidthsArray) { if (self.selectedSegmentIndex == i) break; selectedSegmentOffset = selectedSegmentOffset + [width floatValue]; i++; } return CGRectMake(selectedSegmentOffset + self.selectionIndicatorEdgeInsets.left, indicatorYOffset, [[self.segmentWidthsArray objectAtIndex:self.selectedSegmentIndex] floatValue] - self.selectionIndicatorEdgeInsets.right, self.selectionIndicatorHeight + self.selectionIndicatorEdgeInsets.bottom); } return CGRectMake((self.segmentWidth + self.selectionIndicatorEdgeInsets.left) * self.selectedSegmentIndex, indicatorYOffset, self.segmentWidth - self.selectionIndicatorEdgeInsets.right, self.selectionIndicatorHeight); } } } - (CGRect)frameForFillerSelectionIndicator { if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { CGFloat selectedSegmentOffset = 0.0f; NSInteger i = 0; for (NSNumber *width in self.segmentWidthsArray) { if (self.selectedSegmentIndex == i) { break; } selectedSegmentOffset = selectedSegmentOffset + [width floatValue]; i++; } return CGRectMake(selectedSegmentOffset, 0, [[self.segmentWidthsArray objectAtIndex:self.selectedSegmentIndex] floatValue], CGRectGetHeight(self.frame)); } return CGRectMake(self.segmentWidth * self.selectedSegmentIndex, 0, self.segmentWidth, CGRectGetHeight(self.frame)); } - (void)updateSegmentsRects { self.scrollView.contentInset = UIEdgeInsetsZero; self.scrollView.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame)); if ([self sectionCount] > 0) { self.segmentWidth = self.frame.size.width / [self sectionCount]; } if (self.type == HMSegmentedControlTypeText && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; self.segmentWidth = MAX(stringWidth, self.segmentWidth); }]; } else if (self.type == HMSegmentedControlTypeText && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { NSMutableArray *mutableSegmentWidths = [NSMutableArray array]; [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; [mutableSegmentWidths addObject:[NSNumber numberWithFloat:stringWidth]]; }]; self.segmentWidthsArray = [mutableSegmentWidths copy]; } else if (self.type == HMSegmentedControlTypeImages) { for (UIImage *sectionImage in self.sectionImages) { CGFloat imageWidth = sectionImage.size.width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; self.segmentWidth = MAX(imageWidth, self.segmentWidth); } } else if (self.type == HMSegmentedControlTypeTextImages && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed){ //lets just use the title.. we will assume it is wider then images... [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; self.segmentWidth = MAX(stringWidth, self.segmentWidth); }]; } else if (self.type == HMSegmentedControlTypeTextImages && HMSegmentedControlSegmentWidthStyleDynamic) { NSMutableArray *mutableSegmentWidths = [NSMutableArray array]; int i = 0; [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.right; UIImage *sectionImage = [self.sectionImages objectAtIndex:i]; CGFloat imageWidth = sectionImage.size.width + self.segmentEdgeInset.left; CGFloat combinedWidth = MAX(imageWidth, stringWidth); [mutableSegmentWidths addObject:[NSNumber numberWithFloat:combinedWidth]]; }]; self.segmentWidthsArray = [mutableSegmentWidths copy]; } self.scrollView.scrollEnabled = self.isUserDraggable; self.scrollView.contentSize = CGSizeMake([self totalSegmentedControlWidth], self.frame.size.height); } - (NSUInteger)sectionCount { if (self.type == HMSegmentedControlTypeText) { return self.sectionTitles.count; } else if (self.type == HMSegmentedControlTypeImages || self.type == HMSegmentedControlTypeTextImages) { return self.sectionImages.count; } return 0; } - (void)willMoveToSuperview:(UIView *)newSuperview { // Control is being removed if (newSuperview == nil) return; if (self.sectionTitles || self.sectionImages) { [self updateSegmentsRects]; } } #pragma mark - Touch - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint touchLocation = [touch locationInView:self]; if (CGRectContainsPoint(self.bounds, touchLocation)) { NSInteger segment = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { segment = (touchLocation.x + self.scrollView.contentOffset.x) / self.segmentWidth; } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { // To know which segment the user touched, we need to loop over the widths and substract it from the x position. CGFloat widthLeft = (touchLocation.x + self.scrollView.contentOffset.x); for (NSNumber *width in self.segmentWidthsArray) { widthLeft = widthLeft - [width floatValue]; // When we don't have any width left to substract, we have the segment index. if (widthLeft <= 0) break; segment++; } } NSUInteger sectionsCount = 0; if (self.type == HMSegmentedControlTypeImages) { sectionsCount = [self.sectionImages count]; } else if (self.type == HMSegmentedControlTypeTextImages || self.type == HMSegmentedControlTypeText) { sectionsCount = [self.sectionTitles count]; } if (segment != self.selectedSegmentIndex && segment < sectionsCount) { // Check if we have to do anything with the touch event if (self.isTouchEnabled) [self setSelectedSegmentIndex:segment animated:self.shouldAnimateUserSelection notify:YES]; } } } #pragma mark - Scrolling - (CGFloat)totalSegmentedControlWidth { if (self.type == HMSegmentedControlTypeText && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { return self.sectionTitles.count * self.segmentWidth; } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { return [[self.segmentWidthsArray valueForKeyPath:@"@sum.self"] floatValue]; } else { return self.sectionImages.count * self.segmentWidth; } } - (void)scrollToSelectedSegmentIndex:(BOOL)animated { CGRect rectForSelectedIndex; CGFloat selectedSegmentOffset = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { rectForSelectedIndex = CGRectMake(self.segmentWidth * self.selectedSegmentIndex, 0, self.segmentWidth, self.frame.size.height); selectedSegmentOffset = (CGRectGetWidth(self.frame) / 2) - (self.segmentWidth / 2); } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { NSInteger i = 0; CGFloat offsetter = 0; for (NSNumber *width in self.segmentWidthsArray) { if (self.selectedSegmentIndex == i) break; offsetter = offsetter + [width floatValue]; i++; } rectForSelectedIndex = CGRectMake(offsetter, 0, [[self.segmentWidthsArray objectAtIndex:self.selectedSegmentIndex] floatValue], self.frame.size.height); selectedSegmentOffset = (CGRectGetWidth(self.frame) / 2) - ([[self.segmentWidthsArray objectAtIndex:self.selectedSegmentIndex] floatValue] / 2); } CGRect rectToScrollTo = rectForSelectedIndex; rectToScrollTo.origin.x -= selectedSegmentOffset; rectToScrollTo.size.width += selectedSegmentOffset * 2; [self.scrollView scrollRectToVisible:rectToScrollTo animated:animated]; } #pragma mark - Index Change - (void)setSelectedSegmentIndex:(NSInteger)index { [self setSelectedSegmentIndex:index animated:NO notify:NO]; } - (void)setSelectedSegmentIndex:(NSUInteger)index animated:(BOOL)animated { [self setSelectedSegmentIndex:index animated:animated notify:NO]; } - (void)setSelectedSegmentIndex:(NSUInteger)index animated:(BOOL)animated notify:(BOOL)notify { _selectedSegmentIndex = index; [self setNeedsDisplay]; if (index == HMSegmentedControlNoSegment) { [self.selectionIndicatorArrowLayer removeFromSuperlayer]; [self.selectionIndicatorStripLayer removeFromSuperlayer]; [self.selectionIndicatorBoxLayer removeFromSuperlayer]; } else { [self scrollToSelectedSegmentIndex:animated]; if (animated) { // If the selected segment layer is not added to the super layer, that means no // index is currently selected, so add the layer then move it to the new // segment index without animating. if(self.selectionStyle == HMSegmentedControlSelectionStyleArrow) { if ([self.selectionIndicatorArrowLayer superlayer] == nil) { [self.scrollView.layer addSublayer:self.selectionIndicatorArrowLayer]; [self setSelectedSegmentIndex:index animated:NO notify:YES]; return; } }else { if ([self.selectionIndicatorStripLayer superlayer] == nil) { [self.scrollView.layer addSublayer:self.selectionIndicatorStripLayer]; if (self.selectionStyle == HMSegmentedControlSelectionStyleBox && [self.selectionIndicatorBoxLayer superlayer] == nil) [self.scrollView.layer insertSublayer:self.selectionIndicatorBoxLayer atIndex:0]; [self setSelectedSegmentIndex:index animated:NO notify:YES]; return; } } if (notify) [self notifyForSegmentChangeToIndex:index]; // Restore CALayer animations self.selectionIndicatorArrowLayer.actions = nil; self.selectionIndicatorStripLayer.actions = nil; self.selectionIndicatorBoxLayer.actions = nil; // Animate to new position [CATransaction begin]; [CATransaction setAnimationDuration:0.15f]; [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; [self setArrowFrame]; self.selectionIndicatorBoxLayer.frame = [self frameForSelectionIndicator]; self.selectionIndicatorStripLayer.frame = [self frameForSelectionIndicator]; self.selectionIndicatorBoxLayer.frame = [self frameForFillerSelectionIndicator]; [CATransaction commit]; } else { // Disable CALayer animations NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"position", [NSNull null], @"bounds", nil]; self.selectionIndicatorArrowLayer.actions = newActions; [self setArrowFrame]; self.selectionIndicatorStripLayer.actions = newActions; self.selectionIndicatorStripLayer.frame = [self frameForSelectionIndicator]; self.selectionIndicatorBoxLayer.actions = newActions; self.selectionIndicatorBoxLayer.frame = [self frameForFillerSelectionIndicator]; if (notify) [self notifyForSegmentChangeToIndex:index]; } } } - (void)notifyForSegmentChangeToIndex:(NSInteger)index { if (self.superview) [self sendActionsForControlEvents:UIControlEventValueChanged]; if (self.indexChangeBlock) self.indexChangeBlock(index); } #pragma mark - Styling Support - (NSDictionary *)resultingTitleTextAttributes { NSDictionary *defaults = @{ NSFontAttributeName : [UIFont systemFontOfSize:19.0f], NSForegroundColorAttributeName : [UIColor blackColor], }; NSMutableDictionary *resultingAttrs = [NSMutableDictionary dictionaryWithDictionary:defaults]; if (self.titleTextAttributes) { [resultingAttrs addEntriesFromDictionary:self.titleTextAttributes]; } return [resultingAttrs copy]; } - (NSDictionary *)resultingSelectedTitleTextAttributes { NSMutableDictionary *resultingAttrs = [NSMutableDictionary dictionaryWithDictionary:[self resultingTitleTextAttributes]]; if (self.selectedTitleTextAttributes) { [resultingAttrs addEntriesFromDictionary:self.selectedTitleTextAttributes]; } return [resultingAttrs copy]; } @end ================================================ FILE: BeeFun/infer-out/sources/MBProgressHUD.m.045dbb041f57e2890a8587701e40a10f ================================================ // // MBProgressHUD.m // Version 0.9.2 // Created by Matej Bukovinski on 2.4.09. // #import "MBProgressHUD.h" #import #if __has_feature(objc_arc) #define MB_AUTORELEASE(exp) exp #define MB_RELEASE(exp) exp #define MB_RETAIN(exp) exp #else #define MB_AUTORELEASE(exp) [exp autorelease] #define MB_RELEASE(exp) [exp release] #define MB_RETAIN(exp) [exp retain] #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 #define MBLabelAlignmentCenter NSTextAlignmentCenter #else #define MBLabelAlignmentCenter UITextAlignmentCenter #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \ sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero; #else #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero; #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin) \ attributes:@{NSFontAttributeName:font} context:nil].size : CGSizeZero; #else #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ sizeWithFont:font constrainedToSize:maxSize lineBreakMode:mode] : CGSizeZero; #endif #ifndef kCFCoreFoundationVersionNumber_iOS_7_0 #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 #endif #ifndef kCFCoreFoundationVersionNumber_iOS_8_0 #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 #endif static const CGFloat kPadding = 4.f; static const CGFloat kLabelFontSize = 16.f; static const CGFloat kDetailsLabelFontSize = 12.f; @interface MBProgressHUD () { BOOL useAnimation; SEL methodForExecution; id targetForExecution; id objectForExecution; UILabel *label; UILabel *detailsLabel; BOOL isFinished; CGAffineTransform rotationTransform; } @property (atomic, MB_STRONG) UIView *indicator; @property (atomic, MB_STRONG) NSTimer *graceTimer; @property (atomic, MB_STRONG) NSTimer *minShowTimer; @property (atomic, MB_STRONG) NSDate *showStarted; @end @implementation MBProgressHUD #pragma mark - Properties @synthesize animationType; @synthesize delegate; @synthesize opacity; @synthesize color; @synthesize labelFont; @synthesize labelColor; @synthesize detailsLabelFont; @synthesize detailsLabelColor; @synthesize indicator; @synthesize xOffset; @synthesize yOffset; @synthesize minSize; @synthesize square; @synthesize margin; @synthesize dimBackground; @synthesize graceTime; @synthesize minShowTime; @synthesize graceTimer; @synthesize minShowTimer; @synthesize taskInProgress; @synthesize removeFromSuperViewOnHide; @synthesize customView; @synthesize showStarted; @synthesize mode; @synthesize labelText; @synthesize detailsLabelText; @synthesize progress; @synthesize size; @synthesize activityIndicatorColor; #if NS_BLOCKS_AVAILABLE @synthesize completionBlock; #endif #pragma mark - Class methods + (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; [hud show:animated]; return MB_AUTORELEASE(hud); } + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [self HUDForView:view]; if (hud != nil) { hud.removeFromSuperViewOnHide = YES; [hud hide:animated]; return YES; } return NO; } + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { NSArray *huds = [MBProgressHUD allHUDsForView:view]; for (MBProgressHUD *hud in huds) { hud.removeFromSuperViewOnHide = YES; [hud hide:animated]; } return [huds count]; } + (MB_INSTANCETYPE)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:self]) { return (MBProgressHUD *)subview; } } return nil; } + (NSArray *)allHUDsForView:(UIView *)view { NSMutableArray *huds = [NSMutableArray array]; NSArray *subviews = view.subviews; for (UIView *aView in subviews) { if ([aView isKindOfClass:self]) { [huds addObject:aView]; } } return [NSArray arrayWithArray:huds]; } #pragma mark - Lifecycle - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Set default values for properties self.animationType = MBProgressHUDAnimationFade; self.mode = MBProgressHUDModeIndeterminate; self.labelText = nil; self.detailsLabelText = nil; self.opacity = 0.8f; self.color = nil; self.labelFont = [UIFont boldSystemFontOfSize:kLabelFontSize]; self.labelColor = [UIColor whiteColor]; self.detailsLabelFont = [UIFont boldSystemFontOfSize:kDetailsLabelFontSize]; self.detailsLabelColor = [UIColor whiteColor]; self.activityIndicatorColor = [UIColor whiteColor]; self.xOffset = 0.0f; self.yOffset = 0.0f; self.dimBackground = NO; self.margin = 20.0f; self.cornerRadius = 10.0f; self.graceTime = 0.0f; self.minShowTime = 0.0f; self.removeFromSuperViewOnHide = NO; self.minSize = CGSizeZero; self.square = NO; self.contentMode = UIViewContentModeCenter; self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; // Transparent background self.opaque = NO; self.backgroundColor = [UIColor clearColor]; // Make it invisible for now self.alpha = 0.0f; taskInProgress = NO; rotationTransform = CGAffineTransformIdentity; [self setupLabels]; [self updateIndicators]; [self registerForKVO]; [self registerForNotifications]; } return self; } - (id)initWithView:(UIView *)view { NSAssert(view, @"View must not be nil."); return [self initWithFrame:view.bounds]; } - (id)initWithWindow:(UIWindow *)window { return [self initWithView:window]; } - (void)dealloc { [self unregisterFromNotifications]; [self unregisterFromKVO]; #if !__has_feature(objc_arc) [color release]; [indicator release]; [label release]; [detailsLabel release]; [labelText release]; [detailsLabelText release]; [graceTimer release]; [minShowTimer release]; [showStarted release]; [customView release]; [labelFont release]; [labelColor release]; [detailsLabelFont release]; [detailsLabelColor release]; #if NS_BLOCKS_AVAILABLE [completionBlock release]; #endif [super dealloc]; #endif } #pragma mark - Show & hide - (void)show:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); useAnimation = animated; // If the grace time is set postpone the HUD display if (self.graceTime > 0.0) { NSTimer *newGraceTimer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:newGraceTimer forMode:NSRunLoopCommonModes]; self.graceTimer = newGraceTimer; } // ... otherwise show the HUD imediately else { [self showUsingAnimation:useAnimation]; } } - (void)hide:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); useAnimation = animated; // If the minShow time is set, calculate how long the hud was shown, // and pospone the hiding operation if necessary if (self.minShowTime > 0.0 && showStarted) { NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; if (interv < self.minShowTime) { self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; return; } } // ... otherwise hide the HUD immediately [self hideUsingAnimation:useAnimation]; } - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; } - (void)hideDelayed:(NSNumber *)animated { [self hide:[animated boolValue]]; } #pragma mark - Timer callbacks - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running if (taskInProgress) { [self showUsingAnimation:useAnimation]; } } - (void)handleMinShowTimer:(NSTimer *)theTimer { [self hideUsingAnimation:useAnimation]; } #pragma mark - View Hierrarchy - (void)didMoveToSuperview { [self updateForCurrentOrientationAnimated:NO]; } #pragma mark - Internal show & hide operations - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls [NSObject cancelPreviousPerformRequestsWithTarget:self]; [self setNeedsDisplay]; if (animated && animationType == MBProgressHUDAnimationZoomIn) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } self.showStarted = [NSDate date]; // Fade in if (animated) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.30]; self.alpha = 1.0f; if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { self.transform = rotationTransform; } [UIView commitAnimations]; } else { self.alpha = 1.0f; } } - (void)hideUsingAnimation:(BOOL)animated { // Fade out if (animated && showStarted) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.30]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden // in the done method if (animationType == MBProgressHUDAnimationZoomIn) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } else if (animationType == MBProgressHUDAnimationZoomOut) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } self.alpha = 0.02f; [UIView commitAnimations]; } else { self.alpha = 0.0f; [self done]; } self.showStarted = nil; } - (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void*)context { [self done]; } - (void)done { [NSObject cancelPreviousPerformRequestsWithTarget:self]; isFinished = YES; self.alpha = 0.0f; if (removeFromSuperViewOnHide) { [self removeFromSuperview]; } #if NS_BLOCKS_AVAILABLE if (self.completionBlock) { self.completionBlock(); self.completionBlock = NULL; } #endif if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { [delegate performSelector:@selector(hudWasHidden:) withObject:self]; } } #pragma mark - Threading - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { methodForExecution = method; targetForExecution = MB_RETAIN(target); objectForExecution = MB_RETAIN(object); // Launch execution in new thread self.taskInProgress = YES; [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; // Show HUD view [self show:animated]; } #if NS_BLOCKS_AVAILABLE - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)())completion { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue completionBlock:(MBProgressHUDCompletionBlock)completion { self.taskInProgress = YES; self.completionBlock = completion; dispatch_async(queue, ^(void) { block(); dispatch_async(dispatch_get_main_queue(), ^(void) { [self cleanUp]; }); }); [self show:animated]; } #endif - (void)launchExecution { @autoreleasepool { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" // Start executing the requested task [targetForExecution performSelector:methodForExecution withObject:objectForExecution]; #pragma clang diagnostic pop // Task completed, update view in main thread (note: view operations should // be done only in the main thread) [self performSelectorOnMainThread:@selector(cleanUp) withObject:nil waitUntilDone:NO]; } } - (void)cleanUp { taskInProgress = NO; #if !__has_feature(objc_arc) [targetForExecution release]; [objectForExecution release]; #else targetForExecution = nil; objectForExecution = nil; #endif [self hide:useAnimation]; } #pragma mark - UI - (void)setupLabels { label = [[UILabel alloc] initWithFrame:self.bounds]; label.adjustsFontSizeToFitWidth = NO; label.textAlignment = MBLabelAlignmentCenter; label.opaque = NO; label.backgroundColor = [UIColor clearColor]; label.textColor = self.labelColor; label.font = self.labelFont; label.text = self.labelText; [self addSubview:label]; detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; detailsLabel.font = self.detailsLabelFont; detailsLabel.adjustsFontSizeToFitWidth = NO; detailsLabel.textAlignment = MBLabelAlignmentCenter; detailsLabel.opaque = NO; detailsLabel.backgroundColor = [UIColor clearColor]; detailsLabel.textColor = self.detailsLabelColor; detailsLabel.numberOfLines = 0; detailsLabel.font = self.detailsLabelFont; detailsLabel.text = self.detailsLabelText; [self addSubview:detailsLabel]; } - (void)updateIndicators { BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; if (mode == MBProgressHUDModeIndeterminate) { if (!isActivityIndicator) { // Update to indeterminate indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); [(UIActivityIndicatorView *)indicator startAnimating]; [self addSubview:indicator]; } #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; #endif } else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); [self addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { // Update to determinante indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); [self addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; } [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; } else if (mode == MBProgressHUDModeCustomView && customView != indicator) { // Update custom view indicator [indicator removeFromSuperview]; self.indicator = customView; [self addSubview:indicator]; } else if (mode == MBProgressHUDModeText) { [indicator removeFromSuperview]; self.indicator = nil; } } #pragma mark - Layout - (void)layoutSubviews { [super layoutSubviews]; // Entirely cover the parent view UIView *parent = self.superview; if (parent) { self.frame = parent.bounds; } CGRect bounds = self.bounds; // Determine the total width and height needed CGFloat maxWidth = bounds.size.width - 4 * margin; CGSize totalSize = CGSizeZero; CGRect indicatorF = indicator.bounds; indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); totalSize.width = MAX(totalSize.width, indicatorF.size.width); totalSize.height += indicatorF.size.height; CGSize labelSize = MB_TEXTSIZE(label.text, label.font); labelSize.width = MIN(labelSize.width, maxWidth); totalSize.width = MAX(totalSize.width, labelSize.width); totalSize.height += labelSize.height; if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { totalSize.height += kPadding; } CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); totalSize.width = MAX(totalSize.width, detailsLabelSize.width); totalSize.height += detailsLabelSize.height; if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { totalSize.height += kPadding; } totalSize.width += 2 * margin; totalSize.height += 2 * margin; // Position elements CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; CGFloat xPos = xOffset; indicatorF.origin.y = yPos; indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; indicator.frame = indicatorF; yPos += indicatorF.size.height; if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { yPos += kPadding; } CGRect labelF; labelF.origin.y = yPos; labelF.origin.x = round((bounds.size.width - labelSize.width) / 2) + xPos; labelF.size = labelSize; label.frame = labelF; yPos += labelF.size.height; if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { yPos += kPadding; } CGRect detailsLabelF; detailsLabelF.origin.y = yPos; detailsLabelF.origin.x = round((bounds.size.width - detailsLabelSize.width) / 2) + xPos; detailsLabelF.size = detailsLabelSize; detailsLabel.frame = detailsLabelF; // Enforce minsize and quare rules if (square) { CGFloat max = MAX(totalSize.width, totalSize.height); if (max <= bounds.size.width - 2 * margin) { totalSize.width = max; } if (max <= bounds.size.height - 2 * margin) { totalSize.height = max; } } if (totalSize.width < minSize.width) { totalSize.width = minSize.width; } if (totalSize.height < minSize.height) { totalSize.height = minSize.height; } size = totalSize; } #pragma mark BG Drawing - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); if (self.dimBackground) { //Gradient colours size_t gradLocationsNum = 2; CGFloat gradLocations[2] = {0.0f, 1.0f}; CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum); CGColorSpaceRelease(colorSpace); //Gradient center CGPoint gradCenter= CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); //Gradient radius float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; //Gradient draw CGContextDrawRadialGradient (context, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation); CGGradientRelease(gradient); } // Set background rect color if (self.color) { CGContextSetFillColorWithColor(context, self.color.CGColor); } else { CGContextSetGrayFillColor(context, 0.0f, self.opacity); } // Center HUD CGRect allRect = self.bounds; // Draw rounded HUD backgroud rect CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); float radius = self.cornerRadius; CGContextBeginPath(context); CGContextMoveToPoint(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (float)M_PI / 2, 0, 0); CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (float)M_PI / 2, 0); CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (float)M_PI / 2, (float)M_PI, 0); CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (float)M_PI, 3 * (float)M_PI / 2, 0); CGContextClosePath(context); CGContextFillPath(context); UIGraphicsPopContext(); } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"mode", @"customView", @"labelText", @"labelFont", @"labelColor", @"detailsLabelText", @"detailsLabelFont", @"detailsLabelColor", @"progress", @"activityIndicatorColor", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO]; } else { [self updateUIForKeypath:keyPath]; } } - (void)updateUIForKeypath:(NSString *)keyPath { if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] || [keyPath isEqualToString:@"activityIndicatorColor"]) { [self updateIndicators]; } else if ([keyPath isEqualToString:@"labelText"]) { label.text = self.labelText; } else if ([keyPath isEqualToString:@"labelFont"]) { label.font = self.labelFont; } else if ([keyPath isEqualToString:@"labelColor"]) { label.textColor = self.labelColor; } else if ([keyPath isEqualToString:@"detailsLabelText"]) { detailsLabel.text = self.detailsLabelText; } else if ([keyPath isEqualToString:@"detailsLabelFont"]) { detailsLabel.font = self.detailsLabelFont; } else if ([keyPath isEqualToString:@"detailsLabelColor"]) { detailsLabel.textColor = self.detailsLabelColor; } else if ([keyPath isEqualToString:@"progress"]) { if ([indicator respondsToSelector:@selector(setProgress:)]) { [(id)indicator setValue:@(progress) forKey:@"progress"]; } return; } [self setNeedsLayout]; [self setNeedsDisplay]; } #pragma mark - Notifications - (void)registerForNotifications { #if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } - (void)unregisterFromNotifications { #if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } #if !TARGET_OS_TV - (void)statusBarOrientationDidChange:(NSNotification *)notification { UIView *superview = self.superview; if (!superview) { return; } else { [self updateForCurrentOrientationAnimated:YES]; } } #endif - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case if (self.superview) { self.bounds = self.superview.bounds; [self setNeedsDisplay]; } // Not needed on iOS 8+, compile out when the deployment target allows, // to avoid sharedApplication problems on extension targets #if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 // Only needed pre iOS 7 when added to a window BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGFloat radians = 0; if (UIInterfaceOrientationIsLandscape(orientation)) { if (orientation == UIInterfaceOrientationLandscapeLeft) { radians = -(CGFloat)M_PI_2; } else { radians = (CGFloat)M_PI_2; } // Window coordinates differ! self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); } else { if (orientation == UIInterfaceOrientationPortraitUpsideDown) { radians = (CGFloat)M_PI; } else { radians = 0; } } rotationTransform = CGAffineTransformMakeRotation(radians); if (animated) { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.3]; } [self setTransform:rotationTransform]; if (animated) { [UIView commitAnimations]; } #endif } @end @implementation MBRoundProgressView #pragma mark - Lifecycle - (id)init { return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)]; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; self.opaque = NO; _progress = 0.f; _annular = NO; _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; [self registerForKVO]; } return self; } - (void)dealloc { [self unregisterFromKVO]; #if !__has_feature(objc_arc) [_progressTintColor release]; [_backgroundTintColor release]; [super dealloc]; #endif } #pragma mark - Drawing - (void)drawRect:(CGRect)rect { CGRect allRect = self.bounds; CGRect circleRect = CGRectInset(allRect, 2.0f, 2.0f); CGContextRef context = UIGraphicsGetCurrentContext(); if (_annular) { // Draw background BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; processBackgroundPath.lineWidth = lineWidth; processBackgroundPath.lineCapStyle = kCGLineCapButt; CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); CGFloat radius = (self.bounds.size.width - lineWidth)/2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (2 * (float)M_PI) + startAngle; [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; [_backgroundTintColor set]; [processBackgroundPath stroke]; // Draw progress UIBezierPath *processPath = [UIBezierPath bezierPath]; processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare; processPath.lineWidth = lineWidth; endAngle = (self.progress * 2 * (float)M_PI) + startAngle; [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; [_progressTintColor set]; [processPath stroke]; } else { // Draw background [_progressTintColor setStroke]; [_backgroundTintColor setFill]; CGContextSetLineWidth(context, 2.0f); CGContextFillEllipseInRect(context, circleRect); CGContextStrokeEllipseInRect(context, circleRect); // Draw progress CGPoint center = CGPointMake(allRect.size.width / 2, allRect.size.height / 2); CGFloat radius = (allRect.size.width - 4) / 2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; [_progressTintColor setFill]; CGContextMoveToPoint(context, center.x, center.y); CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); CGContextClosePath(context); CGContextFillPath(context); } } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"progressTintColor", @"backgroundTintColor", @"progress", @"annular", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [self setNeedsDisplay]; } @end @implementation MBBarProgressView #pragma mark - Lifecycle - (id)init { return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)]; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _progress = 0.f; _lineColor = [UIColor whiteColor]; _progressColor = [UIColor whiteColor]; _progressRemainingColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor]; self.opaque = NO; [self registerForKVO]; } return self; } - (void)dealloc { [self unregisterFromKVO]; #if !__has_feature(objc_arc) [_lineColor release]; [_progressColor release]; [_progressRemainingColor release]; [super dealloc]; #endif } #pragma mark - Drawing - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 2); CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); // Draw background float radius = (rect.size.height / 2) - 2; CGContextMoveToPoint(context, 2, rect.size.height/2); CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); CGContextFillPath(context); // Draw border CGContextMoveToPoint(context, 2, rect.size.height/2); CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); CGContextStrokePath(context); CGContextSetFillColorWithColor(context, [_progressColor CGColor]); radius = radius - 2; float amount = self.progress * rect.size.width; // Progress in the middle area if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, amount, 4); CGContextAddLineToPoint(context, amount, radius + 4); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, amount, rect.size.height - 4); CGContextAddLineToPoint(context, amount, radius + 4); CGContextFillPath(context); } // Progress in the right arc else if (amount > radius + 4) { float x = amount - (rect.size.width - radius - 4); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); float angle = -acos(x/radius); if (isnan(angle)) angle = 0; CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); CGContextAddLineToPoint(context, amount, rect.size.height/2); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4); angle = acos(x/radius); if (isnan(angle)) angle = 0; CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1); CGContextAddLineToPoint(context, amount, rect.size.height/2); CGContextFillPath(context); } // Progress is in the left arc else if (amount < radius + 4 && amount > 0) { CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); CGContextFillPath(context); } } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"lineColor", @"progressRemainingColor", @"progressColor", @"progress", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [self setNeedsDisplay]; } @end ================================================ FILE: BeeFun/infer-out/sources/MBProgressHUD.m.2d788876e46e11285e0fd8ab23884da0 ================================================ // // MBProgressHUD.m // Version 0.9.2 // Created by Matej Bukovinski on 2.4.09. // #import "MBProgressHUD.h" #import #if __has_feature(objc_arc) #define MB_AUTORELEASE(exp) exp #define MB_RELEASE(exp) exp #define MB_RETAIN(exp) exp #else #define MB_AUTORELEASE(exp) [exp autorelease] #define MB_RELEASE(exp) [exp release] #define MB_RETAIN(exp) [exp retain] #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 #define MBLabelAlignmentCenter NSTextAlignmentCenter #else #define MBLabelAlignmentCenter UITextAlignmentCenter #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text \ sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero; #else #define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero; #endif #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin) \ attributes:@{NSFontAttributeName:font} context:nil].size : CGSizeZero; #else #define MB_MULTILINE_TEXTSIZE(text, font, maxSize, mode) [text length] > 0 ? [text \ sizeWithFont:font constrainedToSize:maxSize lineBreakMode:mode] : CGSizeZero; #endif #ifndef kCFCoreFoundationVersionNumber_iOS_7_0 #define kCFCoreFoundationVersionNumber_iOS_7_0 847.20 #endif #ifndef kCFCoreFoundationVersionNumber_iOS_8_0 #define kCFCoreFoundationVersionNumber_iOS_8_0 1129.15 #endif static const CGFloat kPadding = 4.f; static const CGFloat kLabelFontSize = 16.f; static const CGFloat kDetailsLabelFontSize = 12.f; @interface MBProgressHUD () { BOOL useAnimation; SEL methodForExecution; id targetForExecution; id objectForExecution; UILabel *label; UILabel *detailsLabel; BOOL isFinished; CGAffineTransform rotationTransform; } @property (atomic, MB_STRONG) UIView *indicator; @property (atomic, MB_STRONG) NSTimer *graceTimer; @property (atomic, MB_STRONG) NSTimer *minShowTimer; @property (atomic, MB_STRONG) NSDate *showStarted; @end @implementation MBProgressHUD #pragma mark - Properties @synthesize animationType; @synthesize delegate; @synthesize opacity; @synthesize color; @synthesize labelFont; @synthesize labelColor; @synthesize detailsLabelFont; @synthesize detailsLabelColor; @synthesize indicator; @synthesize xOffset; @synthesize yOffset; @synthesize minSize; @synthesize square; @synthesize margin; @synthesize dimBackground; @synthesize graceTime; @synthesize minShowTime; @synthesize graceTimer; @synthesize minShowTimer; @synthesize taskInProgress; @synthesize removeFromSuperViewOnHide; @synthesize customView; @synthesize showStarted; @synthesize mode; @synthesize labelText; @synthesize detailsLabelText; @synthesize progress; @synthesize size; @synthesize activityIndicatorColor; #if NS_BLOCKS_AVAILABLE @synthesize completionBlock; #endif #pragma mark - Class methods + (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [[self alloc] initWithView:view]; hud.removeFromSuperViewOnHide = YES; [view addSubview:hud]; [hud show:animated]; return MB_AUTORELEASE(hud); } + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated { MBProgressHUD *hud = [self HUDForView:view]; if (hud != nil) { hud.removeFromSuperViewOnHide = YES; [hud hide:animated]; return YES; } return NO; } + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated { NSArray *huds = [MBProgressHUD allHUDsForView:view]; for (MBProgressHUD *hud in huds) { hud.removeFromSuperViewOnHide = YES; [hud hide:animated]; } return [huds count]; } + (MB_INSTANCETYPE)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:self]) { return (MBProgressHUD *)subview; } } return nil; } + (NSArray *)allHUDsForView:(UIView *)view { NSMutableArray *huds = [NSMutableArray array]; NSArray *subviews = view.subviews; for (UIView *aView in subviews) { if ([aView isKindOfClass:self]) { [huds addObject:aView]; } } return [NSArray arrayWithArray:huds]; } #pragma mark - Lifecycle - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Set default values for properties self.animationType = MBProgressHUDAnimationFade; self.mode = MBProgressHUDModeIndeterminate; self.labelText = nil; self.detailsLabelText = nil; self.opacity = 0.8f; self.color = nil; self.labelFont = [UIFont boldSystemFontOfSize:kLabelFontSize]; self.labelColor = [UIColor whiteColor]; self.detailsLabelFont = [UIFont boldSystemFontOfSize:kDetailsLabelFontSize]; self.detailsLabelColor = [UIColor whiteColor]; self.activityIndicatorColor = [UIColor whiteColor]; self.xOffset = 0.0f; self.yOffset = 0.0f; self.dimBackground = NO; self.margin = 20.0f; self.cornerRadius = 10.0f; self.graceTime = 0.0f; self.minShowTime = 0.0f; self.removeFromSuperViewOnHide = NO; self.minSize = CGSizeZero; self.square = NO; self.contentMode = UIViewContentModeCenter; self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; // Transparent background self.opaque = NO; self.backgroundColor = [UIColor clearColor]; // Make it invisible for now self.alpha = 0.0f; taskInProgress = NO; rotationTransform = CGAffineTransformIdentity; [self setupLabels]; [self updateIndicators]; [self registerForKVO]; [self registerForNotifications]; } return self; } - (id)initWithView:(UIView *)view { NSAssert(view, @"View must not be nil."); return [self initWithFrame:view.bounds]; } - (id)initWithWindow:(UIWindow *)window { return [self initWithView:window]; } - (void)dealloc { [self unregisterFromNotifications]; [self unregisterFromKVO]; #if !__has_feature(objc_arc) [color release]; [indicator release]; [label release]; [detailsLabel release]; [labelText release]; [detailsLabelText release]; [graceTimer release]; [minShowTimer release]; [showStarted release]; [customView release]; [labelFont release]; [labelColor release]; [detailsLabelFont release]; [detailsLabelColor release]; #if NS_BLOCKS_AVAILABLE [completionBlock release]; #endif [super dealloc]; #endif } #pragma mark - Show & hide - (void)show:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); useAnimation = animated; // If the grace time is set postpone the HUD display if (self.graceTime > 0.0) { NSTimer *newGraceTimer = [NSTimer timerWithTimeInterval:self.graceTime target:self selector:@selector(handleGraceTimer:) userInfo:nil repeats:NO]; [[NSRunLoop currentRunLoop] addTimer:newGraceTimer forMode:NSRunLoopCommonModes]; self.graceTimer = newGraceTimer; } // ... otherwise show the HUD imediately else { [self showUsingAnimation:useAnimation]; } } - (void)hide:(BOOL)animated { NSAssert([NSThread isMainThread], @"MBProgressHUD needs to be accessed on the main thread."); useAnimation = animated; // If the minShow time is set, calculate how long the hud was shown, // and pospone the hiding operation if necessary if (self.minShowTime > 0.0 && showStarted) { NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:showStarted]; if (interv < self.minShowTime) { self.minShowTimer = [NSTimer scheduledTimerWithTimeInterval:(self.minShowTime - interv) target:self selector:@selector(handleMinShowTimer:) userInfo:nil repeats:NO]; return; } } // ... otherwise hide the HUD immediately [self hideUsingAnimation:useAnimation]; } - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay { [self performSelector:@selector(hideDelayed:) withObject:[NSNumber numberWithBool:animated] afterDelay:delay]; } - (void)hideDelayed:(NSNumber *)animated { [self hide:[animated boolValue]]; } #pragma mark - Timer callbacks - (void)handleGraceTimer:(NSTimer *)theTimer { // Show the HUD only if the task is still running if (taskInProgress) { [self showUsingAnimation:useAnimation]; } } - (void)handleMinShowTimer:(NSTimer *)theTimer { [self hideUsingAnimation:useAnimation]; } #pragma mark - View Hierrarchy - (void)didMoveToSuperview { [self updateForCurrentOrientationAnimated:NO]; } #pragma mark - Internal show & hide operations - (void)showUsingAnimation:(BOOL)animated { // Cancel any scheduled hideDelayed: calls [NSObject cancelPreviousPerformRequestsWithTarget:self]; [self setNeedsDisplay]; if (animated && animationType == MBProgressHUDAnimationZoomIn) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } else if (animated && animationType == MBProgressHUDAnimationZoomOut) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } self.showStarted = [NSDate date]; // Fade in if (animated) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.30]; self.alpha = 1.0f; if (animationType == MBProgressHUDAnimationZoomIn || animationType == MBProgressHUDAnimationZoomOut) { self.transform = rotationTransform; } [UIView commitAnimations]; } else { self.alpha = 1.0f; } } - (void)hideUsingAnimation:(BOOL)animated { // Fade out if (animated && showStarted) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.30]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; // 0.02 prevents the hud from passing through touches during the animation the hud will get completely hidden // in the done method if (animationType == MBProgressHUDAnimationZoomIn) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(1.5f, 1.5f)); } else if (animationType == MBProgressHUDAnimationZoomOut) { self.transform = CGAffineTransformConcat(rotationTransform, CGAffineTransformMakeScale(0.5f, 0.5f)); } self.alpha = 0.02f; [UIView commitAnimations]; } else { self.alpha = 0.0f; [self done]; } self.showStarted = nil; } - (void)animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void*)context { [self done]; } - (void)done { [NSObject cancelPreviousPerformRequestsWithTarget:self]; isFinished = YES; self.alpha = 0.0f; if (removeFromSuperViewOnHide) { [self removeFromSuperview]; } #if NS_BLOCKS_AVAILABLE if (self.completionBlock) { self.completionBlock(); self.completionBlock = NULL; } #endif if ([delegate respondsToSelector:@selector(hudWasHidden:)]) { [delegate performSelector:@selector(hudWasHidden:) withObject:self]; } } #pragma mark - Threading - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated { methodForExecution = method; targetForExecution = MB_RETAIN(target); objectForExecution = MB_RETAIN(object); // Launch execution in new thread self.taskInProgress = YES; [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil]; // Show HUD view [self show:animated]; } #if NS_BLOCKS_AVAILABLE - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(void (^)())completion { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:completion]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue { [self showAnimated:animated whileExecutingBlock:block onQueue:queue completionBlock:NULL]; } - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue completionBlock:(MBProgressHUDCompletionBlock)completion { self.taskInProgress = YES; self.completionBlock = completion; dispatch_async(queue, ^(void) { block(); dispatch_async(dispatch_get_main_queue(), ^(void) { [self cleanUp]; }); }); [self show:animated]; } #endif - (void)launchExecution { @autoreleasepool { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" // Start executing the requested task [targetForExecution performSelector:methodForExecution withObject:objectForExecution]; #pragma clang diagnostic pop // Task completed, update view in main thread (note: view operations should // be done only in the main thread) [self performSelectorOnMainThread:@selector(cleanUp) withObject:nil waitUntilDone:NO]; } } - (void)cleanUp { taskInProgress = NO; #if !__has_feature(objc_arc) [targetForExecution release]; [objectForExecution release]; #else targetForExecution = nil; objectForExecution = nil; #endif [self hide:useAnimation]; } #pragma mark - UI - (void)setupLabels { label = [[UILabel alloc] initWithFrame:self.bounds]; label.adjustsFontSizeToFitWidth = NO; label.textAlignment = MBLabelAlignmentCenter; label.opaque = NO; label.backgroundColor = [UIColor clearColor]; label.textColor = self.labelColor; label.font = self.labelFont; label.text = self.labelText; [self addSubview:label]; detailsLabel = [[UILabel alloc] initWithFrame:self.bounds]; detailsLabel.font = self.detailsLabelFont; detailsLabel.adjustsFontSizeToFitWidth = NO; detailsLabel.textAlignment = MBLabelAlignmentCenter; detailsLabel.opaque = NO; detailsLabel.backgroundColor = [UIColor clearColor]; detailsLabel.textColor = self.detailsLabelColor; detailsLabel.numberOfLines = 0; detailsLabel.font = self.detailsLabelFont; detailsLabel.text = self.detailsLabelText; [self addSubview:detailsLabel]; } - (void)updateIndicators { BOOL isActivityIndicator = [indicator isKindOfClass:[UIActivityIndicatorView class]]; BOOL isRoundIndicator = [indicator isKindOfClass:[MBRoundProgressView class]]; if (mode == MBProgressHUDModeIndeterminate) { if (!isActivityIndicator) { // Update to indeterminate indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]); [(UIActivityIndicatorView *)indicator startAnimating]; [self addSubview:indicator]; } #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 50000 [(UIActivityIndicatorView *)indicator setColor:self.activityIndicatorColor]; #endif } else if (mode == MBProgressHUDModeDeterminateHorizontalBar) { // Update to bar determinate indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[MBBarProgressView alloc] init]); [self addSubview:indicator]; } else if (mode == MBProgressHUDModeDeterminate || mode == MBProgressHUDModeAnnularDeterminate) { if (!isRoundIndicator) { // Update to determinante indicator [indicator removeFromSuperview]; self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]); [self addSubview:indicator]; } if (mode == MBProgressHUDModeAnnularDeterminate) { [(MBRoundProgressView *)indicator setAnnular:YES]; } [(MBRoundProgressView *)indicator setProgressTintColor:self.activityIndicatorColor]; [(MBRoundProgressView *)indicator setBackgroundTintColor:[self.activityIndicatorColor colorWithAlphaComponent:0.1f]]; } else if (mode == MBProgressHUDModeCustomView && customView != indicator) { // Update custom view indicator [indicator removeFromSuperview]; self.indicator = customView; [self addSubview:indicator]; } else if (mode == MBProgressHUDModeText) { [indicator removeFromSuperview]; self.indicator = nil; } } #pragma mark - Layout - (void)layoutSubviews { [super layoutSubviews]; // Entirely cover the parent view UIView *parent = self.superview; if (parent) { self.frame = parent.bounds; } CGRect bounds = self.bounds; // Determine the total width and height needed CGFloat maxWidth = bounds.size.width - 4 * margin; CGSize totalSize = CGSizeZero; CGRect indicatorF = indicator.bounds; indicatorF.size.width = MIN(indicatorF.size.width, maxWidth); totalSize.width = MAX(totalSize.width, indicatorF.size.width); totalSize.height += indicatorF.size.height; CGSize labelSize = MB_TEXTSIZE(label.text, label.font); labelSize.width = MIN(labelSize.width, maxWidth); totalSize.width = MAX(totalSize.width, labelSize.width); totalSize.height += labelSize.height; if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { totalSize.height += kPadding; } CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; CGSize maxSize = CGSizeMake(maxWidth, remainingHeight); CGSize detailsLabelSize = MB_MULTILINE_TEXTSIZE(detailsLabel.text, detailsLabel.font, maxSize, detailsLabel.lineBreakMode); totalSize.width = MAX(totalSize.width, detailsLabelSize.width); totalSize.height += detailsLabelSize.height; if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { totalSize.height += kPadding; } totalSize.width += 2 * margin; totalSize.height += 2 * margin; // Position elements CGFloat yPos = round(((bounds.size.height - totalSize.height) / 2)) + margin + yOffset; CGFloat xPos = xOffset; indicatorF.origin.y = yPos; indicatorF.origin.x = round((bounds.size.width - indicatorF.size.width) / 2) + xPos; indicator.frame = indicatorF; yPos += indicatorF.size.height; if (labelSize.height > 0.f && indicatorF.size.height > 0.f) { yPos += kPadding; } CGRect labelF; labelF.origin.y = yPos; labelF.origin.x = round((bounds.size.width - labelSize.width) / 2) + xPos; labelF.size = labelSize; label.frame = labelF; yPos += labelF.size.height; if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) { yPos += kPadding; } CGRect detailsLabelF; detailsLabelF.origin.y = yPos; detailsLabelF.origin.x = round((bounds.size.width - detailsLabelSize.width) / 2) + xPos; detailsLabelF.size = detailsLabelSize; detailsLabel.frame = detailsLabelF; // Enforce minsize and quare rules if (square) { CGFloat max = MAX(totalSize.width, totalSize.height); if (max <= bounds.size.width - 2 * margin) { totalSize.width = max; } if (max <= bounds.size.height - 2 * margin) { totalSize.height = max; } } if (totalSize.width < minSize.width) { totalSize.width = minSize.width; } if (totalSize.height < minSize.height) { totalSize.height = minSize.height; } size = totalSize; } #pragma mark BG Drawing - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); if (self.dimBackground) { //Gradient colours size_t gradLocationsNum = 2; CGFloat gradLocations[2] = {0.0f, 1.0f}; CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum); CGColorSpaceRelease(colorSpace); //Gradient center CGPoint gradCenter= CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); //Gradient radius float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; //Gradient draw CGContextDrawRadialGradient (context, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation); CGGradientRelease(gradient); } // Set background rect color if (self.color) { CGContextSetFillColorWithColor(context, self.color.CGColor); } else { CGContextSetGrayFillColor(context, 0.0f, self.opacity); } // Center HUD CGRect allRect = self.bounds; // Draw rounded HUD backgroud rect CGRect boxRect = CGRectMake(round((allRect.size.width - size.width) / 2) + self.xOffset, round((allRect.size.height - size.height) / 2) + self.yOffset, size.width, size.height); float radius = self.cornerRadius; CGContextBeginPath(context); CGContextMoveToPoint(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect)); CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMinY(boxRect) + radius, radius, 3 * (float)M_PI / 2, 0, 0); CGContextAddArc(context, CGRectGetMaxX(boxRect) - radius, CGRectGetMaxY(boxRect) - radius, radius, 0, (float)M_PI / 2, 0); CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMaxY(boxRect) - radius, radius, (float)M_PI / 2, (float)M_PI, 0); CGContextAddArc(context, CGRectGetMinX(boxRect) + radius, CGRectGetMinY(boxRect) + radius, radius, (float)M_PI, 3 * (float)M_PI / 2, 0); CGContextClosePath(context); CGContextFillPath(context); UIGraphicsPopContext(); } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"mode", @"customView", @"labelText", @"labelFont", @"labelColor", @"detailsLabelText", @"detailsLabelFont", @"detailsLabelColor", @"progress", @"activityIndicatorColor", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(updateUIForKeypath:) withObject:keyPath waitUntilDone:NO]; } else { [self updateUIForKeypath:keyPath]; } } - (void)updateUIForKeypath:(NSString *)keyPath { if ([keyPath isEqualToString:@"mode"] || [keyPath isEqualToString:@"customView"] || [keyPath isEqualToString:@"activityIndicatorColor"]) { [self updateIndicators]; } else if ([keyPath isEqualToString:@"labelText"]) { label.text = self.labelText; } else if ([keyPath isEqualToString:@"labelFont"]) { label.font = self.labelFont; } else if ([keyPath isEqualToString:@"labelColor"]) { label.textColor = self.labelColor; } else if ([keyPath isEqualToString:@"detailsLabelText"]) { detailsLabel.text = self.detailsLabelText; } else if ([keyPath isEqualToString:@"detailsLabelFont"]) { detailsLabel.font = self.detailsLabelFont; } else if ([keyPath isEqualToString:@"detailsLabelColor"]) { detailsLabel.textColor = self.detailsLabelColor; } else if ([keyPath isEqualToString:@"progress"]) { if ([indicator respondsToSelector:@selector(setProgress:)]) { [(id)indicator setValue:@(progress) forKey:@"progress"]; } return; } [self setNeedsLayout]; [self setNeedsDisplay]; } #pragma mark - Notifications - (void)registerForNotifications { #if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(statusBarOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } - (void)unregisterFromNotifications { #if !TARGET_OS_TV NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; #endif } #if !TARGET_OS_TV - (void)statusBarOrientationDidChange:(NSNotification *)notification { UIView *superview = self.superview; if (!superview) { return; } else { [self updateForCurrentOrientationAnimated:YES]; } } #endif - (void)updateForCurrentOrientationAnimated:(BOOL)animated { // Stay in sync with the superview in any case if (self.superview) { self.bounds = self.superview.bounds; [self setNeedsDisplay]; } // Not needed on iOS 8+, compile out when the deployment target allows, // to avoid sharedApplication problems on extension targets #if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 // Only needed pre iOS 7 when added to a window BOOL iOS8OrLater = kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_8_0; if (iOS8OrLater || ![self.superview isKindOfClass:[UIWindow class]]) return; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGFloat radians = 0; if (UIInterfaceOrientationIsLandscape(orientation)) { if (orientation == UIInterfaceOrientationLandscapeLeft) { radians = -(CGFloat)M_PI_2; } else { radians = (CGFloat)M_PI_2; } // Window coordinates differ! self.bounds = CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.width); } else { if (orientation == UIInterfaceOrientationPortraitUpsideDown) { radians = (CGFloat)M_PI; } else { radians = 0; } } rotationTransform = CGAffineTransformMakeRotation(radians); if (animated) { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.3]; } [self setTransform:rotationTransform]; if (animated) { [UIView commitAnimations]; } #endif } @end @implementation MBRoundProgressView #pragma mark - Lifecycle - (id)init { return [self initWithFrame:CGRectMake(0.f, 0.f, 37.f, 37.f)]; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; self.opaque = NO; _progress = 0.f; _annular = NO; _progressTintColor = [[UIColor alloc] initWithWhite:1.f alpha:1.f]; _backgroundTintColor = [[UIColor alloc] initWithWhite:1.f alpha:.1f]; [self registerForKVO]; } return self; } - (void)dealloc { [self unregisterFromKVO]; #if !__has_feature(objc_arc) [_progressTintColor release]; [_backgroundTintColor release]; [super dealloc]; #endif } #pragma mark - Drawing - (void)drawRect:(CGRect)rect { CGRect allRect = self.bounds; CGRect circleRect = CGRectInset(allRect, 2.0f, 2.0f); CGContextRef context = UIGraphicsGetCurrentContext(); if (_annular) { // Draw background BOOL isPreiOS7 = kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0; CGFloat lineWidth = isPreiOS7 ? 5.f : 2.f; UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; processBackgroundPath.lineWidth = lineWidth; processBackgroundPath.lineCapStyle = kCGLineCapButt; CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); CGFloat radius = (self.bounds.size.width - lineWidth)/2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (2 * (float)M_PI) + startAngle; [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; [_backgroundTintColor set]; [processBackgroundPath stroke]; // Draw progress UIBezierPath *processPath = [UIBezierPath bezierPath]; processPath.lineCapStyle = isPreiOS7 ? kCGLineCapRound : kCGLineCapSquare; processPath.lineWidth = lineWidth; endAngle = (self.progress * 2 * (float)M_PI) + startAngle; [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; [_progressTintColor set]; [processPath stroke]; } else { // Draw background [_progressTintColor setStroke]; [_backgroundTintColor setFill]; CGContextSetLineWidth(context, 2.0f); CGContextFillEllipseInRect(context, circleRect); CGContextStrokeEllipseInRect(context, circleRect); // Draw progress CGPoint center = CGPointMake(allRect.size.width / 2, allRect.size.height / 2); CGFloat radius = (allRect.size.width - 4) / 2; CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; [_progressTintColor setFill]; CGContextMoveToPoint(context, center.x, center.y); CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); CGContextClosePath(context); CGContextFillPath(context); } } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"progressTintColor", @"backgroundTintColor", @"progress", @"annular", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [self setNeedsDisplay]; } @end @implementation MBBarProgressView #pragma mark - Lifecycle - (id)init { return [self initWithFrame:CGRectMake(.0f, .0f, 120.0f, 20.0f)]; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { _progress = 0.f; _lineColor = [UIColor whiteColor]; _progressColor = [UIColor whiteColor]; _progressRemainingColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor]; self.opaque = NO; [self registerForKVO]; } return self; } - (void)dealloc { [self unregisterFromKVO]; #if !__has_feature(objc_arc) [_lineColor release]; [_progressColor release]; [_progressRemainingColor release]; [super dealloc]; #endif } #pragma mark - Drawing - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 2); CGContextSetStrokeColorWithColor(context,[_lineColor CGColor]); CGContextSetFillColorWithColor(context, [_progressRemainingColor CGColor]); // Draw background float radius = (rect.size.height / 2) - 2; CGContextMoveToPoint(context, 2, rect.size.height/2); CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); CGContextFillPath(context); // Draw border CGContextMoveToPoint(context, 2, rect.size.height/2); CGContextAddArcToPoint(context, 2, 2, radius + 2, 2, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 2, 2); CGContextAddArcToPoint(context, rect.size.width - 2, 2, rect.size.width - 2, rect.size.height / 2, radius); CGContextAddArcToPoint(context, rect.size.width - 2, rect.size.height - 2, rect.size.width - radius - 2, rect.size.height - 2, radius); CGContextAddLineToPoint(context, radius + 2, rect.size.height - 2); CGContextAddArcToPoint(context, 2, rect.size.height - 2, 2, rect.size.height/2, radius); CGContextStrokePath(context); CGContextSetFillColorWithColor(context, [_progressColor CGColor]); radius = radius - 2; float amount = self.progress * rect.size.width; // Progress in the middle area if (amount >= radius + 4 && amount <= (rect.size.width - radius - 4)) { CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, amount, 4); CGContextAddLineToPoint(context, amount, radius + 4); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, amount, rect.size.height - 4); CGContextAddLineToPoint(context, amount, radius + 4); CGContextFillPath(context); } // Progress in the right arc else if (amount > radius + 4) { float x = amount - (rect.size.width - radius - 4); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 4, 4); float angle = -acos(x/radius); if (isnan(angle)) angle = 0; CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, M_PI, angle, 0); CGContextAddLineToPoint(context, amount, rect.size.height/2); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, rect.size.width - radius - 4, rect.size.height - 4); angle = acos(x/radius); if (isnan(angle)) angle = 0; CGContextAddArc(context, rect.size.width - radius - 4, rect.size.height/2, radius, -M_PI, angle, 1); CGContextAddLineToPoint(context, amount, rect.size.height/2); CGContextFillPath(context); } // Progress is in the left arc else if (amount < radius + 4 && amount > 0) { CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, 4, radius + 4, 4, radius); CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); CGContextMoveToPoint(context, 4, rect.size.height/2); CGContextAddArcToPoint(context, 4, rect.size.height - 4, radius + 4, rect.size.height - 4, radius); CGContextAddLineToPoint(context, radius + 4, rect.size.height/2); CGContextFillPath(context); } } #pragma mark - KVO - (void)registerForKVO { for (NSString *keyPath in [self observableKeypaths]) { [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:NULL]; } } - (void)unregisterFromKVO { for (NSString *keyPath in [self observableKeypaths]) { [self removeObserver:self forKeyPath:keyPath]; } } - (NSArray *)observableKeypaths { return [NSArray arrayWithObjects:@"lineColor", @"progressRemainingColor", @"progressColor", @"progress", nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [self setNeedsDisplay]; } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshAutoFooter.m.ccfbabb8dfc249bd8a1556531300613e ================================================ // // MJRefreshAutoFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshAutoFooter.h" @interface MJRefreshAutoFooter() @end @implementation MJRefreshAutoFooter #pragma mark - 初始化 - (void)willMoveToSuperview:(UIView *)newSuperview { [super willMoveToSuperview:newSuperview]; if (newSuperview) { // 新的父控件 if (self.hidden == NO) { self.scrollView.mj_insetB += self.mj_h; } // 设置位置 self.mj_y = _scrollView.mj_contentH; } else { // 被移除了 if (self.hidden == NO) { self.scrollView.mj_insetB -= self.mj_h; } } } #pragma mark - 过期方法 - (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh { self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh; } - (CGFloat)appearencePercentTriggerAutoRefresh { return self.triggerAutomaticallyRefreshPercent; } #pragma mark - 实现父类的方法 - (void)prepare { [super prepare]; // 默认底部控件100%出现时才会自动刷新 self.triggerAutomaticallyRefreshPercent = 1.0; // 设置为默认状态 self.automaticallyRefresh = YES; } - (void)scrollViewContentSizeDidChange:(NSDictionary *)change { [super scrollViewContentSizeDidChange:change]; // 设置位置 self.mj_y = self.scrollView.mj_contentH; } - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { [super scrollViewContentOffsetDidChange:change]; if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return; if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕 // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理 if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) { // 防止手松开时连续调用 CGPoint old = [change[@"old"] CGPointValue]; CGPoint new = [change[@"new"] CGPointValue]; if (new.y <= old.y) return; // 当底部刷新控件完全出现时,才刷新 [self beginRefreshing]; } } } - (void)scrollViewPanStateDidChange:(NSDictionary *)change { [super scrollViewPanStateDidChange:change]; if (self.state != MJRefreshStateIdle) return; if (_scrollView.panGestureRecognizer.state == UIGestureRecognizerStateEnded) {// 手松开 if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕 if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽 [self beginRefreshing]; } } else { // 超出一个屏幕 if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) { [self beginRefreshing]; } } } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState if (state == MJRefreshStateRefreshing) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self executeRefreshingCallback]; }); } } - (void)setHidden:(BOOL)hidden { BOOL lastHidden = self.isHidden; [super setHidden:hidden]; if (!lastHidden && hidden) { self.state = MJRefreshStateIdle; self.scrollView.mj_insetB -= self.mj_h; } else if (lastHidden && !hidden) { self.scrollView.mj_insetB += self.mj_h; // 设置位置 self.mj_y = _scrollView.mj_contentH; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshAutoGifFooter.m.a31382caf4ac8759682b9a5a16a0c221 ================================================ // // MJRefreshAutoGifFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshAutoGifFooter.h" @interface MJRefreshAutoGifFooter() { __unsafe_unretained UIImageView *_gifView; } /** 所有状态对应的动画图片 */ @property (strong, nonatomic) NSMutableDictionary *stateImages; /** 所有状态对应的动画时间 */ @property (strong, nonatomic) NSMutableDictionary *stateDurations; @end @implementation MJRefreshAutoGifFooter #pragma mark - 懒加载 - (UIImageView *)gifView { if (!_gifView) { UIImageView *gifView = [[UIImageView alloc] init]; [self addSubview:_gifView = gifView]; } return _gifView; } - (NSMutableDictionary *)stateImages { if (!_stateImages) { self.stateImages = [NSMutableDictionary dictionary]; } return _stateImages; } - (NSMutableDictionary *)stateDurations { if (!_stateDurations) { self.stateDurations = [NSMutableDictionary dictionary]; } return _stateDurations; } #pragma mark - 公共方法 - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state { if (images == nil) return; self.stateImages[@(state)] = images; self.stateDurations[@(state)] = @(duration); /* 根据图片设置控件的高度 */ UIImage *image = [images firstObject]; if (image.size.height > self.mj_h) { self.mj_h = image.size.height; } } - (void)setImages:(NSArray *)images forState:(MJRefreshState)state { [self setImages:images duration:images.count * 0.1 forState:state]; } #pragma mark - 实现父类的方法 - (void)placeSubviews { [super placeSubviews]; if (self.gifView.constraints.count) return; self.gifView.frame = self.bounds; if (self.isRefreshingTitleHidden) { self.gifView.contentMode = UIViewContentModeCenter; } else { self.gifView.contentMode = UIViewContentModeRight; self.gifView.mj_w = self.mj_w * 0.5 - 90; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStateRefreshing) { NSArray *images = self.stateImages[@(state)]; if (images.count == 0) return; [self.gifView stopAnimating]; self.gifView.hidden = NO; if (images.count == 1) { // 单张图片 self.gifView.image = [images lastObject]; } else { // 多张图片 self.gifView.animationImages = images; self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; [self.gifView startAnimating]; } } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { [self.gifView stopAnimating]; self.gifView.hidden = YES; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshAutoNormalFooter.m.160698844e47dc16f7937652bf531356 ================================================ // // MJRefreshAutoNormalFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshAutoNormalFooter.h" @interface MJRefreshAutoNormalFooter() @property (weak, nonatomic) UIActivityIndicatorView *loadingView; @end @implementation MJRefreshAutoNormalFooter #pragma mark - 懒加载子控件 - (UIActivityIndicatorView *)loadingView { if (!_loadingView) { UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; loadingView.hidesWhenStopped = YES; [self addSubview:_loadingView = loadingView]; } return _loadingView; } - (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle { _activityIndicatorViewStyle = activityIndicatorViewStyle; self.loadingView = nil; [self setNeedsLayout]; } #pragma makr - 重写父类的方法 - (void)prepare { [super prepare]; self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; } - (void)placeSubviews { [super placeSubviews]; if (self.loadingView.constraints.count) return; // 圈圈 CGFloat loadingCenterX = self.mj_w * 0.5; if (!self.isRefreshingTitleHidden) { loadingCenterX -= 100; } CGFloat loadingCenterY = self.mj_h * 0.5; self.loadingView.center = CGPointMake(loadingCenterX, loadingCenterY); } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { [self.loadingView stopAnimating]; } else if (state == MJRefreshStateRefreshing) { [self.loadingView startAnimating]; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshAutoStateFooter.m.4b8722870b787ea3822663dce7a9a42b ================================================ // // MJRefreshAutoStateFooter.m // MJRefreshExample // // Created by MJ Lee on 15/6/13. // Copyright © 2015年 小码哥. All rights reserved. // #import "MJRefreshAutoStateFooter.h" @interface MJRefreshAutoStateFooter() { /** 显示刷新状态的label */ __unsafe_unretained UILabel *_stateLabel; } /** 所有状态对应的文字 */ @property (strong, nonatomic) NSMutableDictionary *stateTitles; @end @implementation MJRefreshAutoStateFooter #pragma mark - 懒加载 - (NSMutableDictionary *)stateTitles { if (!_stateTitles) { self.stateTitles = [NSMutableDictionary dictionary]; } return _stateTitles; } - (UILabel *)stateLabel { if (!_stateLabel) { [self addSubview:_stateLabel = [UILabel label]]; } return _stateLabel; } #pragma mark - 公共方法 - (void)setTitle:(NSString *)title forState:(MJRefreshState)state { if (title == nil) return; self.stateTitles[@(state)] = title; self.stateLabel.text = self.stateTitles[@(self.state)]; } #pragma mark - 私有方法 - (void)stateLabelClick { if (self.state == MJRefreshStateIdle) { [self beginRefreshing]; } } #pragma mark - 重写父类的方法 - (void)prepare { [super prepare]; // 初始化文字 [self setTitle:MJRefreshAutoFooterIdleText forState:MJRefreshStateIdle]; [self setTitle:MJRefreshAutoFooterRefreshingText forState:MJRefreshStateRefreshing]; [self setTitle:MJRefreshAutoFooterNoMoreDataText forState:MJRefreshStateNoMoreData]; // 监听label self.stateLabel.userInteractionEnabled = YES; [self.stateLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(stateLabelClick)]]; } - (void)placeSubviews { [super placeSubviews]; if (self.stateLabel.constraints.count) return; // 状态标签 self.stateLabel.frame = self.bounds; } - (void)setState:(MJRefreshState)state { MJRefreshCheckState if (self.isRefreshingTitleHidden && state == MJRefreshStateRefreshing) { self.stateLabel.text = nil; } else { self.stateLabel.text = self.stateTitles[@(state)]; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshBackFooter.m.c7c9312f3c1f73ce64abb9b05afc0c3e ================================================ // // MJRefreshBackFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshBackFooter.h" @interface MJRefreshBackFooter() @property (assign, nonatomic) NSInteger lastRefreshCount; @property (assign, nonatomic) CGFloat lastBottomDelta; @end @implementation MJRefreshBackFooter #pragma mark - 初始化 - (void)willMoveToSuperview:(UIView *)newSuperview { [super willMoveToSuperview:newSuperview]; [self scrollViewContentSizeDidChange:nil]; } #pragma mark - 实现父类的方法 - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { [super scrollViewContentOffsetDidChange:change]; // 如果正在刷新,直接返回 if (self.state == MJRefreshStateRefreshing) return; _scrollViewOriginalInset = self.scrollView.contentInset; // 当前的contentOffset CGFloat currentOffsetY = self.scrollView.mj_offsetY; // 尾部控件刚好出现的offsetY CGFloat happenOffsetY = [self happenOffsetY]; // 如果是向下滚动到看不见尾部控件,直接返回 if (currentOffsetY <= happenOffsetY) return; CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h; // 如果已全部加载,仅设置pullingPercent,然后返回 if (self.state == MJRefreshStateNoMoreData) { self.pullingPercent = pullingPercent; return; } if (self.scrollView.isDragging) { self.pullingPercent = pullingPercent; // 普通 和 即将刷新 的临界点 CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h; if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) { // 转为即将刷新状态 self.state = MJRefreshStatePulling; } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) { // 转为普通状态 self.state = MJRefreshStateIdle; } } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 // 开始刷新 [self beginRefreshing]; } else if (pullingPercent < 1) { self.pullingPercent = pullingPercent; } } - (void)scrollViewContentSizeDidChange:(NSDictionary *)change { [super scrollViewContentSizeDidChange:change]; // 内容的高度 CGFloat contentHeight = self.scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom; // 表格的高度 CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom + self.ignoredScrollViewContentInsetBottom; // 设置位置和尺寸 self.mj_y = MAX(contentHeight, scrollHeight); } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态来设置属性 if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { // 刷新完毕 if (MJRefreshStateRefreshing == oldState) { [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ self.scrollView.mj_insetB -= self.lastBottomDelta; // 自动调整透明度 if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; } completion:^(BOOL finished) { self.pullingPercent = 0.0; }]; } CGFloat deltaH = [self heightForContentBreakView]; // 刚刷新完毕 if (MJRefreshStateRefreshing == oldState && deltaH > 0 && self.scrollView.mj_totalDataCount != self.lastRefreshCount) { self.scrollView.mj_offsetY = self.scrollView.mj_offsetY; } } else if (state == MJRefreshStateRefreshing) { // 记录刷新前的数量 self.lastRefreshCount = self.scrollView.mj_totalDataCount; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom; CGFloat deltaH = [self heightForContentBreakView]; if (deltaH < 0) { // 如果内容高度小于view的高度 bottom -= deltaH; } self.lastBottomDelta = bottom - self.scrollView.mj_insetB; self.scrollView.mj_insetB = bottom; self.scrollView.mj_offsetY = [self happenOffsetY] + self.mj_h; } completion:^(BOOL finished) { [self executeRefreshingCallback]; }]; } } #pragma mark - 公共方法 - (void)endRefreshing { if ([self.scrollView isKindOfClass:[UICollectionView class]]) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [super endRefreshing]; }); } else { [super endRefreshing]; } } - (void)noticeNoMoreData { if ([self.scrollView isKindOfClass:[UICollectionView class]]) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [super noticeNoMoreData]; }); } else { [super noticeNoMoreData]; } } #pragma mark - 私有方法 #pragma mark 获得scrollView的内容 超出 view 的高度 - (CGFloat)heightForContentBreakView { CGFloat h = self.scrollView.frame.size.height - self.scrollViewOriginalInset.bottom - self.scrollViewOriginalInset.top; return self.scrollView.contentSize.height - h; } #pragma mark 刚好看到上拉刷新控件时的contentOffset.y - (CGFloat)happenOffsetY { CGFloat deltaH = [self heightForContentBreakView]; if (deltaH > 0) { return deltaH - self.scrollViewOriginalInset.top; } else { return - self.scrollViewOriginalInset.top; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshBackGifFooter.m.9fbdeffb50ad5cddb2eb31f449cef553 ================================================ // // MJRefreshBackGifFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshBackGifFooter.h" @interface MJRefreshBackGifFooter() { __unsafe_unretained UIImageView *_gifView; } /** 所有状态对应的动画图片 */ @property (strong, nonatomic) NSMutableDictionary *stateImages; /** 所有状态对应的动画时间 */ @property (strong, nonatomic) NSMutableDictionary *stateDurations; @end @implementation MJRefreshBackGifFooter #pragma mark - 懒加载 - (UIImageView *)gifView { if (!_gifView) { UIImageView *gifView = [[UIImageView alloc] init]; [self addSubview:_gifView = gifView]; } return _gifView; } - (NSMutableDictionary *)stateImages { if (!_stateImages) { self.stateImages = [NSMutableDictionary dictionary]; } return _stateImages; } - (NSMutableDictionary *)stateDurations { if (!_stateDurations) { self.stateDurations = [NSMutableDictionary dictionary]; } return _stateDurations; } #pragma mark - 公共方法 - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state { if (images == nil) return; self.stateImages[@(state)] = images; self.stateDurations[@(state)] = @(duration); /* 根据图片设置控件的高度 */ UIImage *image = [images firstObject]; if (image.size.height > self.mj_h) { self.mj_h = image.size.height; } } - (void)setImages:(NSArray *)images forState:(MJRefreshState)state { [self setImages:images duration:images.count * 0.1 forState:state]; } #pragma mark - 实现父类的方法 - (void)setPullingPercent:(CGFloat)pullingPercent { [super setPullingPercent:pullingPercent]; NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; if (self.state != MJRefreshStateIdle || images.count == 0) return; [self.gifView stopAnimating]; NSUInteger index = images.count * pullingPercent; if (index >= images.count) index = images.count - 1; self.gifView.image = images[index]; } - (void)placeSubviews { [super placeSubviews]; if (self.gifView.constraints.count) return; self.gifView.frame = self.bounds; if (self.stateLabel.hidden) { self.gifView.contentMode = UIViewContentModeCenter; } else { self.gifView.contentMode = UIViewContentModeRight; self.gifView.mj_w = self.mj_w * 0.5 - 90; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { NSArray *images = self.stateImages[@(state)]; if (images.count == 0) return; self.gifView.hidden = NO; [self.gifView stopAnimating]; if (images.count == 1) { // 单张图片 self.gifView.image = [images lastObject]; } else { // 多张图片 self.gifView.animationImages = images; self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; [self.gifView startAnimating]; } } else if (state == MJRefreshStateIdle) { self.gifView.hidden = NO; } else if (state == MJRefreshStateNoMoreData) { self.gifView.hidden = YES; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshBackNormalFooter.m.9fee50dbf43908ec8fb61f6997bcab26 ================================================ // // MJRefreshBackNormalFooter.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshBackNormalFooter.h" @interface MJRefreshBackNormalFooter() { __unsafe_unretained UIImageView *_arrowView; } @property (weak, nonatomic) UIActivityIndicatorView *loadingView; @end @implementation MJRefreshBackNormalFooter #pragma mark - 懒加载子控件 - (UIImageView *)arrowView { if (!_arrowView) { UIImage *image = [UIImage imageNamed:MJRefreshSrcName(@"arrow.png")] ?: [UIImage imageNamed:MJRefreshFrameworkSrcName(@"arrow.png")]; UIImageView *arrowView = [[UIImageView alloc] initWithImage:image]; [self addSubview:_arrowView = arrowView]; } return _arrowView; } - (UIActivityIndicatorView *)loadingView { if (!_loadingView) { UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; loadingView.hidesWhenStopped = YES; [self addSubview:_loadingView = loadingView]; } return _loadingView; } - (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle { _activityIndicatorViewStyle = activityIndicatorViewStyle; self.loadingView = nil; [self setNeedsLayout]; } #pragma makr - 重写父类的方法 - (void)prepare { [super prepare]; self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; } - (void)placeSubviews { [super placeSubviews]; // 箭头的中心点 CGFloat arrowCenterX = self.mj_w * 0.5; if (!self.stateLabel.hidden) { arrowCenterX -= 100; } CGFloat arrowCenterY = self.mj_h * 0.5; CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY); // 箭头 if (self.arrowView.constraints.count == 0) { self.arrowView.mj_size = self.arrowView.image.size; self.arrowView.center = arrowCenter; } // 圈圈 if (self.loadingView.constraints.count == 0) { self.loadingView.center = arrowCenter; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStateIdle) { if (oldState == MJRefreshStateRefreshing) { self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ self.loadingView.alpha = 0.0; } completion:^(BOOL finished) { self.loadingView.alpha = 1.0; [self.loadingView stopAnimating]; self.arrowView.hidden = NO; }]; } else { self.arrowView.hidden = NO; [self.loadingView stopAnimating]; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); }]; } } else if (state == MJRefreshStatePulling) { self.arrowView.hidden = NO; [self.loadingView stopAnimating]; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.arrowView.transform = CGAffineTransformIdentity; }]; } else if (state == MJRefreshStateRefreshing) { self.arrowView.hidden = YES; [self.loadingView startAnimating]; } else if (state == MJRefreshStateNoMoreData) { self.arrowView.hidden = YES; [self.loadingView stopAnimating]; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshBackStateFooter.m.d38f2bdb12763b5fdd12e2cbeee1c695 ================================================ // // MJRefreshBackStateFooter.m // MJRefreshExample // // Created by MJ Lee on 15/6/13. // Copyright © 2015年 小码哥. All rights reserved. // #import "MJRefreshBackStateFooter.h" @interface MJRefreshBackStateFooter() { /** 显示刷新状态的label */ __unsafe_unretained UILabel *_stateLabel; } /** 所有状态对应的文字 */ @property (strong, nonatomic) NSMutableDictionary *stateTitles; @end @implementation MJRefreshBackStateFooter #pragma mark - 懒加载 - (NSMutableDictionary *)stateTitles { if (!_stateTitles) { self.stateTitles = [NSMutableDictionary dictionary]; } return _stateTitles; } - (UILabel *)stateLabel { if (!_stateLabel) { [self addSubview:_stateLabel = [UILabel label]]; } return _stateLabel; } #pragma mark - 公共方法 - (void)setTitle:(NSString *)title forState:(MJRefreshState)state { if (title == nil) return; self.stateTitles[@(state)] = title; self.stateLabel.text = self.stateTitles[@(self.state)]; } - (NSString *)titleForState:(MJRefreshState)state { return self.stateTitles[@(state)]; } #pragma mark - 重写父类的方法 - (void)prepare { [super prepare]; // 初始化文字 [self setTitle:MJRefreshBackFooterIdleText forState:MJRefreshStateIdle]; [self setTitle:MJRefreshBackFooterPullingText forState:MJRefreshStatePulling]; [self setTitle:MJRefreshBackFooterRefreshingText forState:MJRefreshStateRefreshing]; [self setTitle:MJRefreshBackFooterNoMoreDataText forState:MJRefreshStateNoMoreData]; } - (void)placeSubviews { [super placeSubviews]; if (self.stateLabel.constraints.count) return; // 状态标签 self.stateLabel.frame = self.bounds; } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 设置状态文字 self.stateLabel.text = self.stateTitles[@(state)]; } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshComponent.m.34ccc65193a850aa6cacb1e560d2e18f ================================================ // 代码地址: https://github.com/CoderMJLee/MJRefresh // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 // MJRefreshComponent.m // MJRefreshExample // // Created by MJ Lee on 15/3/4. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshComponent.h" #import "MJRefreshConst.h" #import "UIView+MJExtension.h" #import "UIScrollView+MJRefresh.h" @interface MJRefreshComponent() @property (strong, nonatomic) UIPanGestureRecognizer *pan; @end @implementation MJRefreshComponent #pragma mark - 初始化 - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // 准备工作 [self prepare]; // 默认是普通状态 self.state = MJRefreshStateIdle; } return self; } - (void)prepare { // 基本属性 self.autoresizingMask = UIViewAutoresizingFlexibleWidth; self.backgroundColor = [UIColor clearColor]; } - (void)layoutSubviews { [super layoutSubviews]; [self placeSubviews]; } - (void)placeSubviews{} - (void)willMoveToSuperview:(UIView *)newSuperview { [super willMoveToSuperview:newSuperview]; // 如果不是UIScrollView,不做任何事情 if (newSuperview && ![newSuperview isKindOfClass:[UIScrollView class]]) return; // 旧的父控件移除监听 [self removeObservers]; if (newSuperview) { // 新的父控件 // 设置宽度 self.mj_w = newSuperview.mj_w; // 设置位置 self.mj_x = 0; // 记录UIScrollView _scrollView = (UIScrollView *)newSuperview; // 设置永远支持垂直弹簧效果 _scrollView.alwaysBounceVertical = YES; // 记录UIScrollView最开始的contentInset _scrollViewOriginalInset = _scrollView.contentInset; // 添加监听 [self addObservers]; } } - (void)drawRect:(CGRect)rect { [super drawRect:rect]; if (self.state == MJRefreshStateWillRefresh) { // 预防view还没显示出来就调用了beginRefreshing self.state = MJRefreshStateRefreshing; } } #pragma mark - KVO监听 - (void)addObservers { NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld; [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentOffset options:options context:nil]; [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentSize options:options context:nil]; self.pan = self.scrollView.panGestureRecognizer; [self.pan addObserver:self forKeyPath:MJRefreshKeyPathPanState options:options context:nil]; } - (void)removeObservers { [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentOffset]; [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize];; [self.pan removeObserver:self forKeyPath:MJRefreshKeyPathPanState]; self.pan = nil; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { // 遇到这些情况就直接返回 if (!self.userInteractionEnabled) return; // 这个就算看不见也需要处理 if ([keyPath isEqualToString:MJRefreshKeyPathContentSize]) { [self scrollViewContentSizeDidChange:change]; } // 看不见 if (self.hidden) return; if ([keyPath isEqualToString:MJRefreshKeyPathContentOffset]) { [self scrollViewContentOffsetDidChange:change]; } else if ([keyPath isEqualToString:MJRefreshKeyPathPanState]) { [self scrollViewPanStateDidChange:change]; } } - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change{} - (void)scrollViewContentSizeDidChange:(NSDictionary *)change{} - (void)scrollViewPanStateDidChange:(NSDictionary *)change{} #pragma mark - 公共方法 #pragma mark 设置回调对象和回调方法 - (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action { self.refreshingTarget = target; self.refreshingAction = action; } #pragma mark 进入刷新状态 - (void)beginRefreshing { [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.alpha = 1.0; }]; self.pullingPercent = 1.0; // 只要正在刷新,就完全显示 if (self.window) { self.state = MJRefreshStateRefreshing; } else { self.state = MJRefreshStateWillRefresh; // 刷新(预防从另一个控制器回到这个控制器的情况,回来要重新刷新一下) [self setNeedsDisplay]; } } #pragma mark 结束刷新状态 - (void)endRefreshing { self.state = MJRefreshStateIdle; } #pragma mark 是否正在刷新 - (BOOL)isRefreshing { return self.state == MJRefreshStateRefreshing || self.state == MJRefreshStateWillRefresh; } #pragma mark 自动切换透明度 - (void)setAutoChangeAlpha:(BOOL)autoChangeAlpha { self.automaticallyChangeAlpha = autoChangeAlpha; } - (BOOL)isAutoChangeAlpha { return self.isAutomaticallyChangeAlpha; } - (void)setAutomaticallyChangeAlpha:(BOOL)automaticallyChangeAlpha { _automaticallyChangeAlpha = automaticallyChangeAlpha; if (self.isRefreshing) return; if (automaticallyChangeAlpha) { self.alpha = self.pullingPercent; } else { self.alpha = 1.0; } } #pragma mark 根据拖拽进度设置透明度 - (void)setPullingPercent:(CGFloat)pullingPercent { _pullingPercent = pullingPercent; if (self.isRefreshing) return; if (self.isAutomaticallyChangeAlpha) { self.alpha = pullingPercent; } } #pragma mark - 内部方法 - (void)executeRefreshingCallback { dispatch_async(dispatch_get_main_queue(), ^{ if (self.refreshingBlock) { self.refreshingBlock(); } if ([self.refreshingTarget respondsToSelector:self.refreshingAction]) { MJRefreshMsgSend(MJRefreshMsgTarget(self.refreshingTarget), self.refreshingAction, self); } }); } @end @implementation UILabel(MJRefresh) + (instancetype)label { UILabel *label = [[self alloc] init]; label.font = MJRefreshLabelFont; label.textColor = MJRefreshLabelTextColor; label.autoresizingMask = UIViewAutoresizingFlexibleWidth; label.textAlignment = NSTextAlignmentCenter; label.backgroundColor = [UIColor clearColor]; return label; } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshFooter.m.1171c762a89233728365cd4c56dc3f42 ================================================ // 代码地址: https://github.com/CoderMJLee/MJRefresh // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 // MJRefreshFooter.m // MJRefreshExample // // Created by MJ Lee on 15/3/5. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshFooter.h" @interface MJRefreshFooter() @end @implementation MJRefreshFooter #pragma mark - 构造方法 + (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock { MJRefreshFooter *cmp = [[self alloc] init]; cmp.refreshingBlock = refreshingBlock; return cmp; } + (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action { MJRefreshFooter *cmp = [[self alloc] init]; [cmp setRefreshingTarget:target refreshingAction:action]; return cmp; } #pragma mark - 重写父类的方法 - (void)prepare { [super prepare]; // 设置自己的高度 self.mj_h = MJRefreshFooterHeight; // 默认不会自动隐藏 self.automaticallyHidden = NO; } - (void)willMoveToSuperview:(UIView *)newSuperview { [super willMoveToSuperview:newSuperview]; if (newSuperview) { // 监听scrollView数据的变化 if ([self.scrollView isKindOfClass:[UITableView class]] || [self.scrollView isKindOfClass:[UICollectionView class]]) { [self.scrollView setMj_reloadDataBlock:^(NSInteger totalDataCount) { if (self.isAutomaticallyHidden) { self.hidden = (totalDataCount == 0); } }]; } } } #pragma mark - 公共方法 - (void)endRefreshingWithNoMoreData { self.state = MJRefreshStateNoMoreData; } - (void)noticeNoMoreData { [self endRefreshingWithNoMoreData]; } - (void)resetNoMoreData { self.state = MJRefreshStateIdle; } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshGifHeader.m.ec82e1fce0432afaace206d5863c0918 ================================================ // // MJRefreshGifHeader.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshGifHeader.h" @interface MJRefreshGifHeader() { __unsafe_unretained UIImageView *_gifView; } /** 所有状态对应的动画图片 */ @property (strong, nonatomic) NSMutableDictionary *stateImages; /** 所有状态对应的动画时间 */ @property (strong, nonatomic) NSMutableDictionary *stateDurations; @end @implementation MJRefreshGifHeader #pragma mark - 懒加载 - (UIImageView *)gifView { if (!_gifView) { UIImageView *gifView = [[UIImageView alloc] init]; [self addSubview:_gifView = gifView]; } return _gifView; } - (NSMutableDictionary *)stateImages { if (!_stateImages) { self.stateImages = [NSMutableDictionary dictionary]; } return _stateImages; } - (NSMutableDictionary *)stateDurations { if (!_stateDurations) { self.stateDurations = [NSMutableDictionary dictionary]; } return _stateDurations; } #pragma mark - 公共方法 - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state { if (images == nil) return; self.stateImages[@(state)] = images; self.stateDurations[@(state)] = @(duration); /* 根据图片设置控件的高度 */ UIImage *image = [images firstObject]; if (image.size.height > self.mj_h) { self.mj_h = image.size.height; } } - (void)setImages:(NSArray *)images forState:(MJRefreshState)state { [self setImages:images duration:images.count * 0.1 forState:state]; } #pragma mark - 实现父类的方法 - (void)setPullingPercent:(CGFloat)pullingPercent { [super setPullingPercent:pullingPercent]; NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; if (self.state != MJRefreshStateIdle || images.count == 0) return; // 停止动画 [self.gifView stopAnimating]; // 设置当前需要显示的图片 NSUInteger index = images.count * pullingPercent; if (index >= images.count) index = images.count - 1; self.gifView.image = images[index]; } - (void)placeSubviews { [super placeSubviews]; if (self.gifView.constraints.count) return; self.gifView.frame = self.bounds; if (self.stateLabel.hidden && self.lastUpdatedTimeLabel.hidden) { self.gifView.contentMode = UIViewContentModeCenter; } else { self.gifView.contentMode = UIViewContentModeRight; self.gifView.mj_w = self.mj_w * 0.5 - 90; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { NSArray *images = self.stateImages[@(state)]; if (images.count == 0) return; [self.gifView stopAnimating]; if (images.count == 1) { // 单张图片 self.gifView.image = [images lastObject]; } else { // 多张图片 self.gifView.animationImages = images; self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; [self.gifView startAnimating]; } } else if (state == MJRefreshStateIdle) { [self.gifView stopAnimating]; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshHeader.m.23f6ad1fa93bce55e58df454e3c81f28 ================================================ // 代码地址: https://github.com/CoderMJLee/MJRefresh // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 // MJRefreshHeader.m // MJRefreshExample // // Created by MJ Lee on 15/3/4. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshHeader.h" @interface MJRefreshHeader() @property (assign, nonatomic) CGFloat insetTDelta; @end @implementation MJRefreshHeader #pragma mark - 构造方法 + (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock { MJRefreshHeader *cmp = [[self alloc] init]; cmp.refreshingBlock = refreshingBlock; return cmp; } + (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action { MJRefreshHeader *cmp = [[self alloc] init]; [cmp setRefreshingTarget:target refreshingAction:action]; return cmp; } #pragma mark - 覆盖父类的方法 - (void)prepare { [super prepare]; // 设置key self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; // 设置高度 self.mj_h = MJRefreshHeaderHeight; } - (void)placeSubviews { [super placeSubviews]; // 设置y值(当自己的高度发生改变了,肯定要重新调整Y值,所以放到placeSubviews方法中设置y值) self.mj_y = - self.mj_h - self.ignoredScrollViewContentInsetTop; } - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { [super scrollViewContentOffsetDidChange:change]; // 在刷新的refreshing状态 if (self.state == MJRefreshStateRefreshing) { if (self.window == nil) return; // sectionheader停留解决 CGFloat insetT = - self.scrollView.mj_offsetY > _scrollViewOriginalInset.top ? - self.scrollView.mj_offsetY : _scrollViewOriginalInset.top; insetT = insetT > self.mj_h + _scrollViewOriginalInset.top ? self.mj_h + _scrollViewOriginalInset.top : insetT; self.scrollView.mj_insetT = insetT; self.insetTDelta = _scrollViewOriginalInset.top - insetT; return; } // 跳转到下一个控制器时,contentInset可能会变 _scrollViewOriginalInset = self.scrollView.contentInset; // 当前的contentOffset CGFloat offsetY = self.scrollView.mj_offsetY; // 头部控件刚好出现的offsetY CGFloat happenOffsetY = - self.scrollViewOriginalInset.top; // 如果是向上滚动到看不见头部控件,直接返回 // >= -> > if (offsetY > happenOffsetY) return; // 普通 和 即将刷新 的临界点 CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h; CGFloat pullingPercent = (happenOffsetY - offsetY) / self.mj_h; if (self.scrollView.isDragging) { // 如果正在拖拽 self.pullingPercent = pullingPercent; if (self.state == MJRefreshStateIdle && offsetY < normal2pullingOffsetY) { // 转为即将刷新状态 self.state = MJRefreshStatePulling; } else if (self.state == MJRefreshStatePulling && offsetY >= normal2pullingOffsetY) { // 转为普通状态 self.state = MJRefreshStateIdle; } } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 // 开始刷新 [self beginRefreshing]; } else if (pullingPercent < 1) { self.pullingPercent = pullingPercent; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStateIdle) { if (oldState != MJRefreshStateRefreshing) return; // 保存刷新时间 [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey]; [[NSUserDefaults standardUserDefaults] synchronize]; // 恢复inset和offset [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ self.scrollView.mj_insetT += self.insetTDelta; // 自动调整透明度 if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; } completion:^(BOOL finished) { self.pullingPercent = 0.0; }]; } else if (state == MJRefreshStateRefreshing) { [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ // 增加滚动区域 CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; self.scrollView.mj_insetT = top; // 设置滚动位置 self.scrollView.mj_offsetY = - top; } completion:^(BOOL finished) { [self executeRefreshingCallback]; }]; } } - (void)drawRect:(CGRect)rect { [super drawRect:rect]; } #pragma mark - 公共方法 - (void)endRefreshing { if ([self.scrollView isKindOfClass:[UICollectionView class]]) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [super endRefreshing]; }); } else { [super endRefreshing]; } } - (NSDate *)lastUpdatedTime { return [[NSUserDefaults standardUserDefaults] objectForKey:self.lastUpdatedTimeKey]; } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshNormalHeader.m.1bda2488e255708da2996916537e8619 ================================================ // // MJRefreshNormalHeader.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshNormalHeader.h" @interface MJRefreshNormalHeader() { __unsafe_unretained UIImageView *_arrowView; } @property (weak, nonatomic) UIActivityIndicatorView *loadingView; @end @implementation MJRefreshNormalHeader #pragma mark - 懒加载子控件 - (UIImageView *)arrowView { if (!_arrowView) { UIImage *image = [UIImage imageNamed:MJRefreshSrcName(@"arrow.png")] ?: [UIImage imageNamed:MJRefreshFrameworkSrcName(@"arrow.png")]; UIImageView *arrowView = [[UIImageView alloc] initWithImage:image]; [self addSubview:_arrowView = arrowView]; } return _arrowView; } - (UIActivityIndicatorView *)loadingView { if (!_loadingView) { UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; loadingView.hidesWhenStopped = YES; [self addSubview:_loadingView = loadingView]; } return _loadingView; } #pragma mark - 公共方法 - (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle { _activityIndicatorViewStyle = activityIndicatorViewStyle; self.loadingView = nil; [self setNeedsLayout]; } #pragma makr - 重写父类的方法 - (void)prepare { [super prepare]; self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; } - (void)placeSubviews { [super placeSubviews]; // 箭头的中心点 CGFloat arrowCenterX = self.mj_w * 0.5; if (!self.stateLabel.hidden) { arrowCenterX -= 100; } CGFloat arrowCenterY = self.mj_h * 0.5; CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY); // 箭头 if (self.arrowView.constraints.count == 0) { self.arrowView.mj_size = self.arrowView.image.size; self.arrowView.center = arrowCenter; } // 圈圈 if (self.loadingView.constraints.count == 0) { self.loadingView.center = arrowCenter; } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态做事情 if (state == MJRefreshStateIdle) { if (oldState == MJRefreshStateRefreshing) { self.arrowView.transform = CGAffineTransformIdentity; [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ self.loadingView.alpha = 0.0; } completion:^(BOOL finished) { // 如果执行完动画发现不是idle状态,就直接返回,进入其他状态 if (self.state != MJRefreshStateIdle) return; self.loadingView.alpha = 1.0; [self.loadingView stopAnimating]; self.arrowView.hidden = NO; }]; } else { [self.loadingView stopAnimating]; self.arrowView.hidden = NO; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.arrowView.transform = CGAffineTransformIdentity; }]; } } else if (state == MJRefreshStatePulling) { [self.loadingView stopAnimating]; self.arrowView.hidden = NO; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); }]; } else if (state == MJRefreshStateRefreshing) { self.loadingView.alpha = 1.0; // 防止refreshing -> idle的动画完毕动作没有被执行 [self.loadingView startAnimating]; self.arrowView.hidden = YES; } } @end ================================================ FILE: BeeFun/infer-out/sources/MJRefreshStateHeader.m.a270adbea6697f5f08d5a7c099a20e77 ================================================ // // MJRefreshStateHeader.m // MJRefreshExample // // Created by MJ Lee on 15/4/24. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "MJRefreshStateHeader.h" @interface MJRefreshStateHeader() { /** 显示上一次刷新时间的label */ __unsafe_unretained UILabel *_lastUpdatedTimeLabel; /** 显示刷新状态的label */ __unsafe_unretained UILabel *_stateLabel; } /** 所有状态对应的文字 */ @property (strong, nonatomic) NSMutableDictionary *stateTitles; @end @implementation MJRefreshStateHeader #pragma mark - 懒加载 - (NSMutableDictionary *)stateTitles { if (!_stateTitles) { self.stateTitles = [NSMutableDictionary dictionary]; } return _stateTitles; } - (UILabel *)stateLabel { if (!_stateLabel) { [self addSubview:_stateLabel = [UILabel label]]; } return _stateLabel; } - (UILabel *)lastUpdatedTimeLabel { if (!_lastUpdatedTimeLabel) { [self addSubview:_lastUpdatedTimeLabel = [UILabel label]]; } return _lastUpdatedTimeLabel; } #pragma mark - 公共方法 - (void)setTitle:(NSString *)title forState:(MJRefreshState)state { if (title == nil) return; self.stateTitles[@(state)] = title; self.stateLabel.text = self.stateTitles[@(self.state)]; } #pragma mark - 日历获取在9.x之后的系统使用currentCalendar会出异常。在8.0之后使用系统新API。 - (NSCalendar *)currentCalendar { if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) { return [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; } return [NSCalendar currentCalendar]; } #pragma mark key的处理 - (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey { [super setLastUpdatedTimeKey:lastUpdatedTimeKey]; // 如果label隐藏了,就不用再处理 if (self.lastUpdatedTimeLabel.hidden) return; NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey]; // 如果有block if (self.lastUpdatedTimeText) { self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime); return; } if (lastUpdatedTime) { // 1.获得年月日 NSCalendar *calendar = [self currentCalendar]; NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute; NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime]; NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; // 2.格式化日期 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; if ([cmp1 day] == [cmp2 day]) { // 今天 // formatter.dateFormat = @"今天 HH:mm"; formatter.dateFormat = @"HH:mm"; } else if ([cmp1 year] == [cmp2 year]) { // 今年 formatter.dateFormat = @"MM-dd HH:mm"; } else { formatter.dateFormat = @"yyyy-MM-dd HH:mm"; } NSString *time = [formatter stringFromDate:lastUpdatedTime]; // 3.显示日期 // self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"最后更新:%@", time]; self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"Last Update:%@", time]; } else { // self.lastUpdatedTimeLabel.text = @"最后更新:无记录"; self.lastUpdatedTimeLabel.text = @"Last Update:No recored"; } } #pragma mark - 覆盖父类的方法 - (void)prepare { [super prepare]; // 初始化文字 [self setTitle:MJRefreshHeaderIdleText forState:MJRefreshStateIdle]; [self setTitle:MJRefreshHeaderPullingText forState:MJRefreshStatePulling]; [self setTitle:MJRefreshHeaderRefreshingText forState:MJRefreshStateRefreshing]; } - (void)placeSubviews { [super placeSubviews]; if (self.stateLabel.hidden) return; BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0; if (self.lastUpdatedTimeLabel.hidden) { // 状态 if (noConstrainsOnStatusLabel) self.stateLabel.frame = self.bounds; } else { CGFloat stateLabelH = self.mj_h * 0.5; // 状态 if (noConstrainsOnStatusLabel) { self.stateLabel.mj_x = 0; self.stateLabel.mj_y = 0; self.stateLabel.mj_w = self.mj_w; self.stateLabel.mj_h = stateLabelH; } // 更新时间 if (self.lastUpdatedTimeLabel.constraints.count == 0) { self.lastUpdatedTimeLabel.mj_x = 0; self.lastUpdatedTimeLabel.mj_y = stateLabelH; self.lastUpdatedTimeLabel.mj_w = self.mj_w; self.lastUpdatedTimeLabel.mj_h = self.mj_h - self.lastUpdatedTimeLabel.mj_y; } } } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 设置状态文字 self.stateLabel.text = self.stateTitles[@(state)]; // 重新设置key(重新显示时间) self.lastUpdatedTimeKey = self.lastUpdatedTimeKey; } @end ================================================ FILE: BeeFun/infer-out/sources/UIScrollView+MJExtension.m.e58616bc3e3601567328a68aaf6990a3 ================================================ // 代码地址: https://github.com/CoderMJLee/MJRefresh // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 // UIScrollView+Extension.m // MJRefreshExample // // Created by MJ Lee on 14-5-28. // Copyright (c) 2014年 小码哥. All rights reserved. // #import "UIScrollView+MJExtension.h" #import @implementation UIScrollView (MJExtension) - (void)setMj_insetT:(CGFloat)mj_insetT { UIEdgeInsets inset = self.contentInset; inset.top = mj_insetT; self.contentInset = inset; } - (CGFloat)mj_insetT { return self.contentInset.top; } - (void)setMj_insetB:(CGFloat)mj_insetB { UIEdgeInsets inset = self.contentInset; inset.bottom = mj_insetB; self.contentInset = inset; } - (CGFloat)mj_insetB { return self.contentInset.bottom; } - (void)setMj_insetL:(CGFloat)mj_insetL { UIEdgeInsets inset = self.contentInset; inset.left = mj_insetL; self.contentInset = inset; } - (CGFloat)mj_insetL { return self.contentInset.left; } - (void)setMj_insetR:(CGFloat)mj_insetR { UIEdgeInsets inset = self.contentInset; inset.right = mj_insetR; self.contentInset = inset; } - (CGFloat)mj_insetR { return self.contentInset.right; } - (void)setMj_offsetX:(CGFloat)mj_offsetX { CGPoint offset = self.contentOffset; offset.x = mj_offsetX; self.contentOffset = offset; } - (CGFloat)mj_offsetX { return self.contentOffset.x; } - (void)setMj_offsetY:(CGFloat)mj_offsetY { CGPoint offset = self.contentOffset; offset.y = mj_offsetY; self.contentOffset = offset; } - (CGFloat)mj_offsetY { return self.contentOffset.y; } - (void)setMj_contentW:(CGFloat)mj_contentW { CGSize size = self.contentSize; size.width = mj_contentW; self.contentSize = size; } - (CGFloat)mj_contentW { return self.contentSize.width; } - (void)setMj_contentH:(CGFloat)mj_contentH { CGSize size = self.contentSize; size.height = mj_contentH; self.contentSize = size; } - (CGFloat)mj_contentH { return self.contentSize.height; } @end ================================================ FILE: BeeFun/infer-out/sources/UIScrollView+MJRefresh.m.c656b88045d9e660612378e050df8caa ================================================ // 代码地址: https://github.com/CoderMJLee/MJRefresh // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 // UIScrollView+MJRefresh.m // MJRefreshExample // // Created by MJ Lee on 15/3/4. // Copyright (c) 2015年 小码哥. All rights reserved. // #import "UIScrollView+MJRefresh.h" #import "MJRefreshHeader.h" #import "MJRefreshFooter.h" #import @implementation NSObject (MJRefresh) + (void)exchangeInstanceMethod1:(SEL)method1 method2:(SEL)method2 { method_exchangeImplementations(class_getInstanceMethod(self, method1), class_getInstanceMethod(self, method2)); } + (void)exchangeClassMethod1:(SEL)method1 method2:(SEL)method2 { method_exchangeImplementations(class_getClassMethod(self, method1), class_getClassMethod(self, method2)); } @end @implementation UIScrollView (MJRefresh) #pragma mark - header static const char MJRefreshHeaderKey = '\0'; - (void)setMj_header:(MJRefreshHeader *)mj_header { if (mj_header != self.mj_header) { // 删除旧的,添加新的 [self.mj_header removeFromSuperview]; [self insertSubview:mj_header atIndex:0]; // 存储新的 [self willChangeValueForKey:@"mj_header"]; // KVO objc_setAssociatedObject(self, &MJRefreshHeaderKey, mj_header, OBJC_ASSOCIATION_ASSIGN); [self didChangeValueForKey:@"mj_header"]; // KVO } } - (MJRefreshHeader *)mj_header { return objc_getAssociatedObject(self, &MJRefreshHeaderKey); } #pragma mark - footer static const char MJRefreshFooterKey = '\0'; - (void)setMj_footer:(MJRefreshFooter *)mj_footer { if (mj_footer != self.mj_footer) { // 删除旧的,添加新的 [self.mj_footer removeFromSuperview]; [self addSubview:mj_footer]; // 存储新的 [self willChangeValueForKey:@"mj_footer"]; // KVO objc_setAssociatedObject(self, &MJRefreshFooterKey, mj_footer, OBJC_ASSOCIATION_ASSIGN); [self didChangeValueForKey:@"mj_footer"]; // KVO } } - (MJRefreshFooter *)mj_footer { return objc_getAssociatedObject(self, &MJRefreshFooterKey); } #pragma mark - 过期 - (void)setFooter:(MJRefreshFooter *)footer { self.mj_footer = footer; } - (MJRefreshFooter *)footer { return self.mj_footer; } - (void)setHeader:(MJRefreshHeader *)header { self.mj_header = header; } - (MJRefreshHeader *)header { return self.mj_header; } #pragma mark - other - (NSInteger)mj_totalDataCount { NSInteger totalCount = 0; if ([self isKindOfClass:[UITableView class]]) { UITableView *tableView = (UITableView *)self; for (NSInteger section = 0; section - App Store (macOS): - macOS open-source project: - Source repository: ## Why This Project BeeFun Pro provides a lightweight and practical mobile experience for developers who need to: - Discover trending repositories quickly - Track notifications, events, and issues - Organize starred repositories - Read repository/user details on mobile ## Core Features - Explore trending repositories (daily/weekly/monthly) - Search repositories and developers - Notifications and event tracking - Starred repository management - Repository/user detail pages - Clean and efficient native UI ## Technology Stack - Language: Swift 5 - Platform: iOS - Networking: Alamofire, Moya - Data/Parsing: ObjectMapper, SwiftyJSON, Kanna - UI/Layout: SnapKit, SkeletonView, MBProgressHUD, MJRefresh - Tooling: CocoaPods, Xcode build configurations ## Project Health Snapshot Latest public metrics (GitHub API): - Stars: 174 - Forks: 35 - Open Issues: 0 - Commits: 368 - Main language: Swift - License: BSD-4-Clause ## Repository Structure See detailed layout at [`docs/architecture/REPO_STRUCTURE.md`](docs/architecture/REPO_STRUCTURE.md). ## Codex for OSS Application Materials To support a Codex for OSS application, use: - Chinese form answers: [`docs/codex-oss/FORM_ANSWERS_zh-CN.md`](docs/codex-oss/FORM_ANSWERS_zh-CN.md) - English form answers: [`docs/codex-oss/FORM_ANSWERS_en.md`](docs/codex-oss/FORM_ANSWERS_en.md) - Project profile and budget: [`docs/codex-oss/PROJECT_PROFILE.md`](docs/codex-oss/PROJECT_PROFILE.md) ## Contributing & Governance - Contributing guide: [`CONTRIBUTING.md`](CONTRIBUTING.md) - Code of Conduct: [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) - Security policy: [`SECURITY.md`](SECURITY.md) ## Legacy Documents Historical docs moved to [`docs/legacy/`](docs/legacy/): - `opensource.md` - `bugs.md` - `suggestion.md` - `reference.md` - `other.md` ## Contact - Email: wenghengcong@icloud.com - Weibo: - Blog: ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability If you discover a security issue, please report it privately by email: - `wenghengcong@icloud.com` Please avoid opening a public issue for vulnerabilities until a fix is available. ## What to Include - Affected version/commit - Reproduction steps or proof of concept - Potential impact - Suggested mitigation (if available) ## Response Targets - Initial acknowledgement: within 7 days - Triage/update: as soon as practical based on severity and maintainer availability ================================================ FILE: docs/README.md ================================================ # Documentation Index - Architecture - [`architecture/REPO_STRUCTURE.md`](architecture/REPO_STRUCTURE.md) - Codex for OSS application - [`codex-oss/PROJECT_PROFILE.md`](codex-oss/PROJECT_PROFILE.md) - [`codex-oss/FORM_ANSWERS_zh-CN.md`](codex-oss/FORM_ANSWERS_zh-CN.md) - [`codex-oss/FORM_ANSWERS_en.md`](codex-oss/FORM_ANSWERS_en.md) - Legacy docs - [`legacy/`](legacy/) ================================================ FILE: docs/architecture/REPO_STRUCTURE.md ================================================ # Repository Structure This file describes the repository layout in a form suitable for external review and OSS funding applications. ## Top Level ```text BeeFun-Pro/ ├── BeeFun/ # iOS app workspace and source ├── docs/ # Application-ready documentation ├── logo/ # Branding assets ├── screenshot/ # Product screenshots ├── LICENSE ├── README.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md └── SECURITY.md ``` ## iOS Project ```text BeeFun/ ├── BeeFun.xcodeproj/ ├── BeeFun.xcworkspace/ ├── BeeFun/ │ ├── Model/ # Data models (repos/users/issues/events/...) │ ├── View/ # UI screens and view controllers │ ├── SystemManager/ # Networking/storage/config/managers │ ├── ToolKit/ # Shared utilities │ ├── Resources/ # Images/plist/localization/certs │ ├── ThirdParty/ # Bundled third-party SDKs/frameworks │ ├── Assets.xcassets/ │ ├── Info.plist │ └── BeeFun.entitlements ├── XcodeConfig/ # Build configurations ├── Podfile ├── Podfile.lock └── fastlane/ ``` ## Documentation ```text docs/ ├── architecture/ │ └── REPO_STRUCTURE.md ├── codex-oss/ │ ├── PROJECT_PROFILE.md │ ├── FORM_ANSWERS_zh-CN.md │ └── FORM_ANSWERS_en.md └── legacy/ ├── bugs.md ├── opensource.md ├── other.md ├── reference.md └── suggestion.md ``` ## Notes - `BeeFun/Pods/` is intentionally ignored from version control. - Legacy docs are retained under `docs/legacy/` for historical context. ================================================ FILE: docs/legacy/bugs.md ================================================ # Thanks 感谢每个提出bugs的用户! Thanks to all of you who report bugs! # Bugs list * v1.0.0 | bugs | report user | fixed version| | ------------- |:-------------:| -----:| | 登录后邮箱地址显示错误| LeonSine |1.0.1| ================================================ FILE: docs/legacy/opensource.md ================================================ ### Open Source lib * [Alamofire](https://github.com/Alamofire/Alamofire) Elegant HTTP Networking in Swift * [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager) Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. * [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON) The better way to deal with JSON data in Swift * [SnapKit](https://github.com/SnapKit/SnapKit) A Swift Autolayout DSL for iOS & OS X [http://snapkit.io](http://snapkit.io) * [Moya](https://github.com/Moya/Moya) Network abstraction layer written in Swift. * [ObjectMapper](https://github.com/Hearst-DD/ObjectMapper) Simple JSON Object mapping written in Swift * [MBProgressHUD](https://github.com/jdg/MBProgressHUD) MBProgressHUD + Customizations [http://www.bukovinski.com/](http://www.bukovinski.com/) * [MJRefresh](https://github.com/CoderMJLee/MJRefresh) An easy way to use pull-to-refresh. ================================================ FILE: docs/legacy/other.md ================================================ ================================================ FILE: docs/legacy/reference.md ================================================ ### Thanks `Coderpursue`使用了下面这些网站的服务或者数据,在此表示感谢! `Coderpursue` use the service or data of these website below.Thanks here. ### web * [Code hub web](http://www.codehub-app.com/) you can also find on [github site](https://github.com/thedillonb/CodeHub) ### app Coderpursue的设计和开发借鉴了Monkey和Codehub两款app.对两位作者的劳动表示感谢! 大家也可以去下载! During the Coderpursue app development process,I borrow some ideas from Monkey and Codehub.Thanks a lot for their works. - [Monkey for Github](https://itunes.apple.com/cn/app/monkey-for-github/id1003765407?l=en&mt=8) - [Codehub](https://itunes.apple.com/cn/app/codehub-a-client-for-github/id707173885?l=en&mt=8) ================================================ FILE: docs/legacy/suggestion.md ================================================ # Thanks 感谢每个提出建议的用户! Thanks to all of you who give me the useful suggestion! # Suggestion list