From ff5e105937e2567f50a7cbd9d84601de5a3069b7 Mon Sep 17 00:00:00 2001 From: xsean Date: Wed, 15 Oct 2025 10:58:21 +0800 Subject: [PATCH] first commit --- .gitignore | 3 + build.py | 51 + install_all.py | 23 + max/build.py | 116 + max/template/Filza.entitlements | 26 + max/template/embedded.mobileprovision | Bin 0 -> 12376 bytes max/template/playbtest/Podfile | 19 + .../playbtest.xcodeproj/project.pbxproj | 604 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 10260 bytes .../xcshareddata/xcschemes/playbtest.xcscheme | 78 + .../xcschemes/xcschememanagement.plist | 14 + .../xcschemes/xcschememanagement.plist | 22 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 273655 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../UserInterfaceState.xcuserstate | Bin 0 -> 273993 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 20 + .../playbtest/playbtest/AppDelegate.swift | 46 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/1024x1024.png | Bin 0 -> 584819 bytes .../AppIcon.appiconset/Contents.json | 14 + .../playbtest/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../playbtest/Base.lproj/Main.storyboard | 24 + max/template/playbtest/playbtest/Info.plist | 507 ++ .../playbtest/PlayB/CocoaAsyncSocket.h | 19 + .../playbtest/PlayB/GCD/GCDAsyncUdpSocket.h | 1036 +++ .../playbtest/PlayB/GCD/GCDAsyncUdpSocket.m | 5632 +++++++++++++++++ .../playbtest/PlayB/MyTableViewCell.swift | 31 + .../playbtest/playbtest/PlayB/XUDPClient.h | 27 + .../playbtest/playbtest/PlayB/XUDPClient.m | 143 + .../playbtest/PlayB/YL_NetWorkManager.swift | 1354 ++++ .../playbtest/playbtest/PlayB/YL_PlayVC.swift | 158 + .../playbtest/playbtest/PlayB/YL_PlayVC.xib | 113 + .../playbtest/PlayB/bbbAdManager.swift | 399 ++ .../playbtest/playbtest/PlayB/closeAD.h | 19 + .../playbtest/playbtest/PlayB/closeAD.m | 141 + .../playbtest/PlayB/closeWindows.swift | 78 + .../playbtest/playbtest/PlayB/getIphone.swift | 154 + .../playbtest/playbtest/PlayB/idfa.swift | 95 + .../playbtest/playbtest/PlayB/playb.pch | 15 + .../PlayB/playbtest-Bridging-Header.h | 6 + .../playbtest/playbtest/ViewController.swift | 19 + topon/build.py | 111 + topon/template/Filza.entitlements | 26 + .../PlayBTopOn.xcodeproj/project.pbxproj | 540 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 10457 bytes .../xcschemes/xcschememanagement.plist | 14 + .../xcschemes/xcschememanagement.plist | 14 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 185629 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../UserInterfaceState.xcuserstate | Bin 0 -> 61684 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../PlayBTopOn/PlayBTopOn/AppDelegate.swift | 41 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 14 + .../AppIcon.appiconset/h687603756335b.png | Bin 0 -> 183029 bytes .../PlayBTopOn/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../PlayBTopOn/Base.lproj/Main.storyboard | 24 + .../PlayBTopOn/Header/MyWallPaperHeader.h | 15 + .../PlayBTopOn/Header/MyWallpaperPCH.pch | 14 + .../template/PlayBTopOn/PlayBTopOn/Info.plist | 555 ++ .../PlayBTopOn/ViewController.swift | 19 + .../PlayBTopOn/playB/CocoaAsyncSocket.h | 19 + .../PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.h | 1036 +++ .../PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.m | 5632 +++++++++++++++++ .../PlayBTopOn/PlayBTopOn/playB/XUDPClient.h | 27 + .../PlayBTopOn/PlayBTopOn/playB/XUDPClient.m | 143 + .../PlayBTopOn/playB/YL_NetWorkManager.swift | 1362 ++++ .../PlayBTopOn/playB/YL_PlayVC.swift | 155 + .../PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.xib | 113 + .../PlayBTopOn/playB/bbbAdManager.swift | 549 ++ .../PlayBTopOn/playB/getIphone.swift | 154 + .../PlayBTopOn/PlayBTopOn/playB/idfa.swift | 96 + .../PlayBTopOn/playB/initializationTopOn.h | 34 + .../PlayBTopOn/playB/initializationTopOn.m | 1034 +++ topon/template/PlayBTopOn/Podfile | 18 + topon/template/PlayBTopOn/Podfile.lock | 69 + topon/template/embedded.mobileprovision | Bin 0 -> 12073 bytes 87 files changed, 23002 insertions(+) create mode 100644 .gitignore create mode 100644 build.py create mode 100644 install_all.py create mode 100644 max/build.py create mode 100644 max/template/Filza.entitlements create mode 100644 max/template/embedded.mobileprovision create mode 100644 max/template/playbtest/Podfile create mode 100644 max/template/playbtest/playbtest.xcodeproj/project.pbxproj create mode 100644 max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 max/template/playbtest/playbtest.xcodeproj/xcshareddata/xcschemes/playbtest.xcscheme create mode 100644 max/template/playbtest/playbtest.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 max/template/playbtest/playbtest.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 max/template/playbtest/playbtest.xcworkspace/contents.xcworkspacedata create mode 100644 max/template/playbtest/playbtest.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 max/template/playbtest/playbtest.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 max/template/playbtest/playbtest.xcworkspace/xcuserdata/yihai16.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 max/template/playbtest/playbtest/AppDelegate.swift create mode 100644 max/template/playbtest/playbtest/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 max/template/playbtest/playbtest/Assets.xcassets/AppIcon.appiconset/1024x1024.png create mode 100644 max/template/playbtest/playbtest/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 max/template/playbtest/playbtest/Assets.xcassets/Contents.json create mode 100644 max/template/playbtest/playbtest/Base.lproj/LaunchScreen.storyboard create mode 100644 max/template/playbtest/playbtest/Base.lproj/Main.storyboard create mode 100644 max/template/playbtest/playbtest/Info.plist create mode 100755 max/template/playbtest/playbtest/PlayB/CocoaAsyncSocket.h create mode 100755 max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.h create mode 100755 max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.m create mode 100644 max/template/playbtest/playbtest/PlayB/MyTableViewCell.swift create mode 100644 max/template/playbtest/playbtest/PlayB/XUDPClient.h create mode 100644 max/template/playbtest/playbtest/PlayB/XUDPClient.m create mode 100644 max/template/playbtest/playbtest/PlayB/YL_NetWorkManager.swift create mode 100644 max/template/playbtest/playbtest/PlayB/YL_PlayVC.swift create mode 100644 max/template/playbtest/playbtest/PlayB/YL_PlayVC.xib create mode 100644 max/template/playbtest/playbtest/PlayB/bbbAdManager.swift create mode 100644 max/template/playbtest/playbtest/PlayB/closeAD.h create mode 100644 max/template/playbtest/playbtest/PlayB/closeAD.m create mode 100644 max/template/playbtest/playbtest/PlayB/closeWindows.swift create mode 100644 max/template/playbtest/playbtest/PlayB/getIphone.swift create mode 100644 max/template/playbtest/playbtest/PlayB/idfa.swift create mode 100644 max/template/playbtest/playbtest/PlayB/playb.pch create mode 100644 max/template/playbtest/playbtest/PlayB/playbtest-Bridging-Header.h create mode 100644 max/template/playbtest/playbtest/ViewController.swift create mode 100644 topon/build.py create mode 100644 topon/template/Filza.entitlements create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.pbxproj create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/contents.xcworkspacedata create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/AppDelegate.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/h687603756335b.png create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/Contents.json create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Base.lproj/LaunchScreen.storyboard create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Base.lproj/Main.storyboard create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallPaperHeader.h create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallpaperPCH.pch create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/Info.plist create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/ViewController.swift create mode 100755 topon/template/PlayBTopOn/PlayBTopOn/playB/CocoaAsyncSocket.h create mode 100755 topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.h create mode 100755 topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.m create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.h create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.m create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/YL_NetWorkManager.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.xib create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/bbbAdManager.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/getIphone.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/idfa.swift create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.h create mode 100644 topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.m create mode 100644 topon/template/PlayBTopOn/Podfile create mode 100644 topon/template/PlayBTopOn/Podfile.lock create mode 100644 topon/template/embedded.mobileprovision diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6175ccd --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +Pods/ +build/ diff --git a/build.py b/build.py new file mode 100644 index 0000000..f532a5d --- /dev/null +++ b/build.py @@ -0,0 +1,51 @@ +import subprocess +import sys +import os +import json + +def build_json(json_path): + with open(json_path, 'r') as f: + config = json.loads(f.read()) + t = config["type"] + if t == "max": + build_max(json_path) + else: + build_topon(json_path) + +def build_max(json_path): + build_path = "/Users/mac/codes/ios/empty_topon/max" + build_script(build_path, json_path, "playb-max.ipa") + + +def build_topon(json_path): + build_path = "/Users/mac/codes/ios/empty_topon/topon" + build_script(build_path, json_path, "playb-topon.ipa") + +def build_script(build_path, json_path, ipa_name): + cmd = """ + cd {0} + python build.py {1} + """.format(build_path, json_path) + + subprocess.call(cmd, shell=True) + + src_ipa = os.path.join(build_path,"build/ipas", ipa_name) + target_path = os.path.dirname(json_path) + cmd = """ + cp -fv {0} {1} + """.format(src_ipa, target_path) + + subprocess.call(cmd, shell=True) + + +def build(base_path): + print(base_path) + for root, dirs, files in os.walk(base_path): + for file in files: + full_path = os.path.join(root, file) + name = os.path.basename(full_path) + if name == 'build.json': + build_json(full_path) + +if __name__ == '__main__': + build(sys.argv[1]) \ No newline at end of file diff --git a/install_all.py b/install_all.py new file mode 100644 index 0000000..ad3109e --- /dev/null +++ b/install_all.py @@ -0,0 +1,23 @@ +import subprocess +import os + + +def install_path(path, type): + cmd = """ + sshpass -p alpine pscp -l root -A -h ./ips.txt {0} /User/Downloads + sshpass -p alpine pssh -l root -A -ih ./ips.txt "appinst /User/Downloads/playb-{1}.ipa" + """.format(path, type) + subprocess.call(cmd, shell=True) + +def install_all(): + for root, dirs, files in os.walk("/Users/mac/codes/ios/empty_topon/ipas/lux"): + for file in files: + full_path:str = os.path.join(root, file) + if full_path.endswith("max.ipa"): + install_path(full_path, "max") + elif full_path.endswith("topon.ipa"): + install_path(full_path, "topon") + + +install_all() + \ No newline at end of file diff --git a/max/build.py b/max/build.py new file mode 100644 index 0000000..3fad4f1 --- /dev/null +++ b/max/build.py @@ -0,0 +1,116 @@ +import subprocess +import json +import sys +import os + + +def build(ad_key, ad_ids, app_display_name,app_bundle_id,app_version,app_icon): + + cmd = """ + rm -rfv build + mkdir build + cp -rfv template/playbtest ./build/ + """ + + subprocess.call(cmd, shell=True) + # 创建编译目录复制模版到build目录 + + print("--------------------") + # 读取配置 + + + + + ### 复制icon + + cmd = f""" + cp -fv {app_icon} ./build/playbtest/playbtest/Assets.xcassets/AppIcon.appiconset/1024x1024.png + """ + subprocess.call(cmd, shell=True) + + ## 修改ad信息 + print("修改ad信息") + code_path = './build/playbtest/playbtest/playB/bbbAdManager.swift' + with open(code_path, 'r') as f: + code = f.read() + code = code.replace("{adKey}", ad_key) + code = code.replace("{allAdIds}", '"' + "\",\"".join(ad_ids) + '"') + with open(code_path, 'w') as f: + f.write(code) + + print("修改项目信息") + prj_path = "./build/playbtest/playbtest.xcodeproj/project.pbxproj" + with open(prj_path, 'r') as f: + code = f.read() + code = code.replace("{DisplayName}", app_display_name) + code = code.replace("{BundleId}", app_bundle_id) + code = code.replace("{Version}", app_version) + with open(prj_path, 'w') as f: + f.write(code) + + print("\n开始编译\n") + cmd = """ + cd ./build/playbtest + pod install --repo-update + xcodebuild clean build -workspace playbtest.xcworkspace -configuration Release -scheme playbtest -derivedDataPath "../Target" -destination "platform=iOS,id=00008110-000815AE1179801E" + cd ../../ + """ + subprocess.call(cmd, shell=True) + + + print("\n开始打包\n") + +# codesign --entitlements ./template/Filza.entitlements -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" ./build/ipas/playbtest.app +# find "./build/ipas/playbtest.app" -name "*.framework" -exec codesign -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" {} \; +# find "./build/ipas/playbtest.app" -name "*.dylib" -exec codesign -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" {} \; +# cp ./template/embedded.mobileprovision ./build/ipas/playbtest.app/embedded.mobileprovision +# codesign --entitlements ./template/Filza.entitlements -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" ./build/ipas/playbtest.app + cmd = """ + mkdir ./build/ipas + cp -rf ./build/Target/Build/Products/Release-iphoneos/playbtest.app ./build/ipas/ + + find "./build/ipas/playbtest.app" -name "*.framework" -exec codesign -f -s "Apple Distribution: Haiyang Tang (544LFS79WN)" {} \; + find "./build/ipas/playbtest.app" -name "*.dylib" -exec codesign -f -s "Apple Distribution: Haiyang Tang (544LFS79WN)" {} \; + cp ./template/embedded.mobileprovision ./build/ipas/playbtest.app/embedded.mobileprovision + echo "codesign" + codesign --entitlements ./template/Filza.entitlements -f -s "Apple Distribution: Haiyang Tang (544LFS79WN)" ./build/ipas/playbtest.app + + mkdir ./build/ipas/Payload + mv ./build/ipas/playbtest.app ./build/ipas/Payload + cd ./build/ipas + zip -r playb-max.ipa Payload/ + """ + + subprocess.call(cmd, shell=True) + + + +if __name__ == '__main__': + app_icon = "/Users/mac/codes/ios/empty_topon/ipas/lux/SpeedyColor/appicon.png" + if len(sys.argv) < 2: + ad_key = "Dd37BrtbLDlaeiDhxVzaDbsI67Mc1h5lAGIinzo4v2IbkpufdtVmT5Tag9O3aGexzkS4txEPigaEexktewANIk" + ad_ids = ["7468dbe129ab2afe","7b61678bf643a84a","c6b7477edc2aff7e","28fd7967e71c9203"] + app_display_name = "TimeCompass:Zones" + app_bundle_id = "com.timeCompass.timeCompassZones" + app_version = "1.1" + + build(ad_key, ad_ids, app_display_name, app_bundle_id, app_version, app_icon) + else: + json_path = sys.argv[1] + with open(json_path, 'r') as f: + config = json.loads(f.read()) + + print(config) + + ad_key = config["sdk_key"] + ad_ids = config["ad_ids"] + app_display_name = config["app_name"] + app_bundle_id = config["app_pkg_name"] + app_version = config["app_ver"] + app_icon_tmp:str = config["app_icon"] + if not app_icon_tmp is None and app_icon_tmp.strip() != '': + app_icon = os.path.join(os.path.dirname(json_path), app_icon_tmp) + + build(ad_key, ad_ids, app_display_name, app_bundle_id, app_version, app_icon) + + diff --git a/max/template/Filza.entitlements b/max/template/Filza.entitlements new file mode 100644 index 0000000..f9b6577 --- /dev/null +++ b/max/template/Filza.entitlements @@ -0,0 +1,26 @@ + + + + + application-identifier + 544LFS79WN.com.keycraft.keyCraft + aps-environment + production + com.apple.developer.associated-domains + * + com.apple.developer.team-identifier + 544LFS79WN + com.apple.security.application-groups + + group.com.keycraft.keyCraft.appshortcallid + group.com.keycraft.keyCraft.appcallid + + get-task-allow + + keychain-access-groups + + 544LFS79WN.* + com.apple.token + + + \ No newline at end of file diff --git a/max/template/embedded.mobileprovision b/max/template/embedded.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..fcf7ced0c44ee4c1aa0395330636581f307e384e GIT binary patch literal 12376 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 RUORTmRho;b!)J6Z`+w3DUSj|N literal 0 HcmV?d00001 diff --git a/max/template/playbtest/Podfile b/max/template/playbtest/Podfile new file mode 100644 index 0000000..40f4d21 --- /dev/null +++ b/max/template/playbtest/Podfile @@ -0,0 +1,19 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'playbtest' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for playbtest + + pod 'AppLovinSDK','13.3.1' + pod 'AppLovinDSPLinkedInAdapter' + pod 'AppLovinMediationVungleAdapter' + pod 'AppLovinMediationMintegralAdapter' + +# pod 'Firebase/Core' +# pod 'Firebase/AnalyticsWithoutAdIdSupport' +# pod 'FirebaseRemoteConfig' + +end diff --git a/max/template/playbtest/playbtest.xcodeproj/project.pbxproj b/max/template/playbtest/playbtest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..997059d --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/project.pbxproj @@ -0,0 +1,604 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 046535802D802D9900B2D19B /* bbbAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0465357F2D802D9900B2D19B /* bbbAdManager.swift */; }; + 048D61A22D67204900FDE496 /* XUDPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 048D61A12D67204900FDE496 /* XUDPClient.m */; }; + 048D61A32D67204900FDE496 /* GCDAsyncUdpSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 048D619E2D67204900FDE496 /* GCDAsyncUdpSocket.m */; }; + 04C0D91E2D83D5030012DDF5 /* MyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C0D91D2D83D5030012DDF5 /* MyTableViewCell.swift */; }; + 751A9FFB2CE1E31700BFC689 /* closeWindows.swift in Sources */ = {isa = PBXBuildFile; fileRef = 751A9FFA2CE1E31700BFC689 /* closeWindows.swift */; }; + 7577E56C2CDA085400B7EDBF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7577E56B2CDA085400B7EDBF /* AppDelegate.swift */; }; + 7577E5702CDA085400B7EDBF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7577E56F2CDA085400B7EDBF /* ViewController.swift */; }; + 7577E5732CDA085400B7EDBF /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 7577E5722CDA085400B7EDBF /* Base */; }; + 7577E5752CDA085900B7EDBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7577E5742CDA085900B7EDBF /* Assets.xcassets */; }; + 7577E5782CDA085900B7EDBF /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 7577E5772CDA085900B7EDBF /* Base */; }; + 7577E5892CDA135500B7EDBF /* YL_PlayVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7577E5872CDA135500B7EDBF /* YL_PlayVC.swift */; }; + 7577E58A2CDA135500B7EDBF /* YL_PlayVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7577E5882CDA135500B7EDBF /* YL_PlayVC.xib */; }; + 75B9949E2D23A4DC0046561D /* getIphone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B9949D2D23A4DC0046561D /* getIphone.swift */; }; + 75B994A02D23AED00046561D /* idfa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B9949F2D23AED00046561D /* idfa.swift */; }; + 75E053D22CDB060E0097DA69 /* YL_NetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E053D12CDB060E0097DA69 /* YL_NetWorkManager.swift */; }; + 75E053D62CDB07F00097DA69 /* closeAD.m in Sources */ = {isa = PBXBuildFile; fileRef = 75E053D52CDB07F00097DA69 /* closeAD.m */; }; + 97D9032452C29760C7B26B57 /* Pods_playbtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED1D072A2AFA6387E393A835 /* Pods_playbtest.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 044C8D012E0CECA500625F9A /* Embed Libraries */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Libraries"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0465357F2D802D9900B2D19B /* bbbAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = bbbAdManager.swift; sourceTree = ""; }; + 048D619C2D67204900FDE496 /* CocoaAsyncSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CocoaAsyncSocket.h; sourceTree = ""; }; + 048D619D2D67204900FDE496 /* GCDAsyncUdpSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCDAsyncUdpSocket.h; sourceTree = ""; }; + 048D619E2D67204900FDE496 /* GCDAsyncUdpSocket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncUdpSocket.m; sourceTree = ""; }; + 048D61A02D67204900FDE496 /* XUDPClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XUDPClient.h; sourceTree = ""; }; + 048D61A12D67204900FDE496 /* XUDPClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XUDPClient.m; sourceTree = ""; }; + 04C0D91D2D83D5030012DDF5 /* MyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyTableViewCell.swift; sourceTree = ""; }; + 365725DAEE7A265FA302BB10 /* Pods-playbtest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-playbtest.release.xcconfig"; path = "Target Support Files/Pods-playbtest/Pods-playbtest.release.xcconfig"; sourceTree = ""; }; + 751A9FFA2CE1E31700BFC689 /* closeWindows.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = closeWindows.swift; sourceTree = ""; }; + 7577E5682CDA085400B7EDBF /* playbtest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = playbtest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7577E56B2CDA085400B7EDBF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7577E56F2CDA085400B7EDBF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 7577E5722CDA085400B7EDBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 7577E5742CDA085900B7EDBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7577E5772CDA085900B7EDBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7577E5792CDA085900B7EDBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7577E5872CDA135500B7EDBF /* YL_PlayVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YL_PlayVC.swift; sourceTree = ""; }; + 7577E5882CDA135500B7EDBF /* YL_PlayVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = YL_PlayVC.xib; sourceTree = ""; }; + 75B9949D2D23A4DC0046561D /* getIphone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = getIphone.swift; sourceTree = ""; }; + 75B9949F2D23AED00046561D /* idfa.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = idfa.swift; sourceTree = ""; }; + 75E053D12CDB060E0097DA69 /* YL_NetWorkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YL_NetWorkManager.swift; sourceTree = ""; }; + 75E053D32CDB07F00097DA69 /* playbtest-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "playbtest-Bridging-Header.h"; sourceTree = ""; }; + 75E053D42CDB07F00097DA69 /* closeAD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = closeAD.h; sourceTree = ""; }; + 75E053D52CDB07F00097DA69 /* closeAD.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = closeAD.m; sourceTree = ""; }; + 75E053D72CDB0D1D0097DA69 /* playb.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = playb.pch; sourceTree = ""; }; + AE60AC68993A5FDD50BCF762 /* Pods-playbtest.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-playbtest.debug.xcconfig"; path = "Target Support Files/Pods-playbtest/Pods-playbtest.debug.xcconfig"; sourceTree = ""; }; + ED1D072A2AFA6387E393A835 /* Pods_playbtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_playbtest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7577E5652CDA085400B7EDBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 97D9032452C29760C7B26B57 /* Pods_playbtest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 048D619F2D67204900FDE496 /* GCD */ = { + isa = PBXGroup; + children = ( + 048D619D2D67204900FDE496 /* GCDAsyncUdpSocket.h */, + 048D619E2D67204900FDE496 /* GCDAsyncUdpSocket.m */, + ); + path = GCD; + sourceTree = ""; + }; + 157CA50DD7C7A6B816F415DB /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED1D072A2AFA6387E393A835 /* Pods_playbtest.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 7577E55F2CDA085400B7EDBF = { + isa = PBXGroup; + children = ( + 7577E56A2CDA085400B7EDBF /* playbtest */, + 7577E5692CDA085400B7EDBF /* Products */, + 7D7F1D418E852DCC300E917E /* Pods */, + 157CA50DD7C7A6B816F415DB /* Frameworks */, + ); + sourceTree = ""; + }; + 7577E5692CDA085400B7EDBF /* Products */ = { + isa = PBXGroup; + children = ( + 7577E5682CDA085400B7EDBF /* playbtest.app */, + ); + name = Products; + sourceTree = ""; + }; + 7577E56A2CDA085400B7EDBF /* playbtest */ = { + isa = PBXGroup; + children = ( + 7577E5812CDA0B0800B7EDBF /* PlayB */, + 7577E56B2CDA085400B7EDBF /* AppDelegate.swift */, + 7577E56F2CDA085400B7EDBF /* ViewController.swift */, + 7577E5712CDA085400B7EDBF /* Main.storyboard */, + 7577E5742CDA085900B7EDBF /* Assets.xcassets */, + 7577E5762CDA085900B7EDBF /* LaunchScreen.storyboard */, + 7577E5792CDA085900B7EDBF /* Info.plist */, + ); + path = playbtest; + sourceTree = ""; + }; + 7577E5812CDA0B0800B7EDBF /* PlayB */ = { + isa = PBXGroup; + children = ( + 048D619C2D67204900FDE496 /* CocoaAsyncSocket.h */, + 048D619F2D67204900FDE496 /* GCD */, + 048D61A02D67204900FDE496 /* XUDPClient.h */, + 048D61A12D67204900FDE496 /* XUDPClient.m */, + 75E053D12CDB060E0097DA69 /* YL_NetWorkManager.swift */, + 7577E5872CDA135500B7EDBF /* YL_PlayVC.swift */, + 7577E5882CDA135500B7EDBF /* YL_PlayVC.xib */, + 75E053D42CDB07F00097DA69 /* closeAD.h */, + 75E053D52CDB07F00097DA69 /* closeAD.m */, + 75E053D32CDB07F00097DA69 /* playbtest-Bridging-Header.h */, + 75E053D72CDB0D1D0097DA69 /* playb.pch */, + 751A9FFA2CE1E31700BFC689 /* closeWindows.swift */, + 75B9949D2D23A4DC0046561D /* getIphone.swift */, + 75B9949F2D23AED00046561D /* idfa.swift */, + 0465357F2D802D9900B2D19B /* bbbAdManager.swift */, + 04C0D91D2D83D5030012DDF5 /* MyTableViewCell.swift */, + ); + path = PlayB; + sourceTree = ""; + }; + 7D7F1D418E852DCC300E917E /* Pods */ = { + isa = PBXGroup; + children = ( + AE60AC68993A5FDD50BCF762 /* Pods-playbtest.debug.xcconfig */, + 365725DAEE7A265FA302BB10 /* Pods-playbtest.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7577E5672CDA085400B7EDBF /* playbtest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7577E57C2CDA085900B7EDBF /* Build configuration list for PBXNativeTarget "playbtest" */; + buildPhases = ( + 8F58E6E75C52EB4FEEF2490F /* [CP] Check Pods Manifest.lock */, + 7577E5642CDA085400B7EDBF /* Sources */, + 7577E5652CDA085400B7EDBF /* Frameworks */, + 7577E5662CDA085400B7EDBF /* Resources */, + 6E50B8AEC76C920BE22FC478 /* [CP] Embed Pods Frameworks */, + 9E8498E018A09B2E436F82F6 /* [CP] Copy Pods Resources */, + 044C8D012E0CECA500625F9A /* Embed Libraries */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = playbtest; + productName = playbtest; + productReference = 7577E5682CDA085400B7EDBF /* playbtest.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7577E5602CDA085400B7EDBF /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1530; + LastUpgradeCheck = 1530; + TargetAttributes = { + 7577E5672CDA085400B7EDBF = { + CreatedOnToolsVersion = 15.3; + LastSwiftMigration = 1530; + }; + }; + }; + buildConfigurationList = 7577E5632CDA085400B7EDBF /* Build configuration list for PBXProject "playbtest" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7577E55F2CDA085400B7EDBF; + productRefGroup = 7577E5692CDA085400B7EDBF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7577E5672CDA085400B7EDBF /* playbtest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7577E5662CDA085400B7EDBF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7577E5752CDA085900B7EDBF /* Assets.xcassets in Resources */, + 7577E58A2CDA135500B7EDBF /* YL_PlayVC.xib in Resources */, + 7577E5782CDA085900B7EDBF /* Base in Resources */, + 7577E5732CDA085400B7EDBF /* Base in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6E50B8AEC76C920BE22FC478 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8F58E6E75C52EB4FEEF2490F /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-playbtest-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; + }; + 9E8498E018A09B2E436F82F6 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-playbtest/Pods-playbtest-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7577E5642CDA085400B7EDBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 048D61A22D67204900FDE496 /* XUDPClient.m in Sources */, + 048D61A32D67204900FDE496 /* GCDAsyncUdpSocket.m in Sources */, + 75E053D62CDB07F00097DA69 /* closeAD.m in Sources */, + 7577E5702CDA085400B7EDBF /* ViewController.swift in Sources */, + 75B994A02D23AED00046561D /* idfa.swift in Sources */, + 04C0D91E2D83D5030012DDF5 /* MyTableViewCell.swift in Sources */, + 7577E56C2CDA085400B7EDBF /* AppDelegate.swift in Sources */, + 7577E5892CDA135500B7EDBF /* YL_PlayVC.swift in Sources */, + 75B9949E2D23A4DC0046561D /* getIphone.swift in Sources */, + 751A9FFB2CE1E31700BFC689 /* closeWindows.swift in Sources */, + 75E053D22CDB060E0097DA69 /* YL_NetWorkManager.swift in Sources */, + 046535802D802D9900B2D19B /* bbbAdManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 7577E5712CDA085400B7EDBF /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7577E5722CDA085400B7EDBF /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 7577E5762CDA085900B7EDBF /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7577E5772CDA085900B7EDBF /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7577E57A2CDA085900B7EDBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 17.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7577E57B2CDA085900B7EDBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 17.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7577E57D2CDA085900B7EDBF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AE60AC68993A5FDD50BCF762 /* Pods-playbtest.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "Don't Code Sign"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = T23C6PFSKY; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_PREFIX_HEADER = "$(SRCROOT)/playbtest/PlayB/playb.pch"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = playbtest/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "{DisplayName}"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/iphoneos/universal/GNUSparseFile.0", + "$(PROJECT_DIR)/iphoneos/arm64e", + "$(PROJECT_DIR)/iphoneos/arm64", + "$(PROJECT_DIR)/iphoneos/universal", + "$(PROJECT_DIR)", + ); + MARKETING_VERSION = {Version}; + PRODUCT_BUNDLE_IDENTIFIER = {BundleId}; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/playbtest/PlayB/playbtest-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 7577E57E2CDA085900B7EDBF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 365725DAEE7A265FA302BB10 /* Pods-playbtest.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "Don't Code Sign"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = T23C6PFSKY; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_PREFIX_HEADER = "$(SRCROOT)/playbtest/PlayB/playb.pch"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = playbtest/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "{DisplayName}"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/iphoneos/universal/GNUSparseFile.0", + "$(PROJECT_DIR)/iphoneos/arm64e", + "$(PROJECT_DIR)/iphoneos/arm64", + "$(PROJECT_DIR)/iphoneos/universal", + "$(PROJECT_DIR)", + ); + MARKETING_VERSION = {Version}; + PRODUCT_BUNDLE_IDENTIFIER = {BundleId}; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/playbtest/PlayB/playbtest-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7577E5632CDA085400B7EDBF /* Build configuration list for PBXProject "playbtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7577E57A2CDA085900B7EDBF /* Debug */, + 7577E57B2CDA085900B7EDBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7577E57C2CDA085900B7EDBF /* Build configuration list for PBXNativeTarget "playbtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7577E57D2CDA085900B7EDBF /* Debug */, + 7577E57E2CDA085900B7EDBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7577E5602CDA085400B7EDBF /* Project object */; +} diff --git a/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate b/max/template/playbtest/playbtest.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..efcff92559ed2153cd415b73784406befe7a375b GIT binary patch literal 10260 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 P5q?E!!f*IH@!|ggLm2~j literal 0 HcmV?d00001 diff --git a/max/template/playbtest/playbtest.xcodeproj/xcshareddata/xcschemes/playbtest.xcscheme b/max/template/playbtest/playbtest.xcodeproj/xcshareddata/xcschemes/playbtest.xcscheme new file mode 100644 index 0000000..8a77293 --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/xcshareddata/xcschemes/playbtest.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/max/template/playbtest/playbtest.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist b/max/template/playbtest/playbtest.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..372eae3 --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + playbtest.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/max/template/playbtest/playbtest.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist b/max/template/playbtest/playbtest.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e39c1f4 --- /dev/null +++ b/max/template/playbtest/playbtest.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + playbtest.xcscheme_^#shared#^_ + + orderHint + 32 + + + SuppressBuildableAutocreation + + 7577E5672CDA085400B7EDBF + + primary + + + + + diff --git a/max/template/playbtest/playbtest.xcworkspace/contents.xcworkspacedata b/max/template/playbtest/playbtest.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..85025c3 --- /dev/null +++ b/max/template/playbtest/playbtest.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/max/template/playbtest/playbtest.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/max/template/playbtest/playbtest.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/max/template/playbtest/playbtest.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate b/max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fe7907aaf2fd33437662be7248c35ff4664bdadc GIT binary patch literal 273655 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%0D>7>{>oO-~PRpF0`Do^X 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 G@BAO~;Z~^t literal 0 HcmV?d00001 diff --git a/max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..a5a1e6d --- /dev/null +++ b/max/template/playbtest/playbtest.xcworkspace/xcuserdata/mac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/max/template/playbtest/playbtest.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate b/max/template/playbtest/playbtest.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..295e189b13989701e1593d59e7a4c59cd5d866e8 GIT binary patch literal 273993 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∈{3UJCzsGj-ac8`*$33wVkNeP{ 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 n*@)ZmJ6Fno + + + + + + + + diff --git a/max/template/playbtest/playbtest/AppDelegate.swift b/max/template/playbtest/playbtest/AppDelegate.swift new file mode 100644 index 0000000..801d6fe --- /dev/null +++ b/max/template/playbtest/playbtest/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// playbtest +// +// Created by 忆海16 on 2024/11/5. +// + +import UIKit +import AppLovinSDK + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + static var shared: AppDelegate { + return UIApplication.shared.delegate as! AppDelegate + } + var window:UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + + window = UIWindow() + window?.frame = UIScreen.main.bounds + let vc = YL_PlayVC() + + window?.rootViewController = UINavigationController(rootViewController: vc) + + BbbAdManager.shared.initConfig() + + BbbAdManager.shared.initAd() + + + window?.makeKeyAndVisible() + + return true + } + + func applicationWillEnterForeground(_ application: UIApplication) { + print("应用从后台进入前台") +// closeWindows.removeADVCByDelayTime(0) + closeAD.removeADVC(byDelayTime: 0) + + } + + +} + diff --git a/max/template/playbtest/playbtest/Assets.xcassets/AccentColor.colorset/Contents.json b/max/template/playbtest/playbtest/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/max/template/playbtest/playbtest/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/max/template/playbtest/playbtest/Assets.xcassets/AppIcon.appiconset/1024x1024.png b/max/template/playbtest/playbtest/Assets.xcassets/AppIcon.appiconset/1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..856435eba43e78fc2c235b99f52e01dd73ebb5d4 GIT binary patch literal 584819 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

e&`cXMm)02N00GRui;uA;Xz-)Z&+*D;i4T#nL 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

Dgt_`3E<0uRs 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π-|z3JnqrRdoz&jF{{8W@o$~9UB{y7 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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/max/template/playbtest/playbtest/Base.lproj/Main.storyboard b/max/template/playbtest/playbtest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/max/template/playbtest/playbtest/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/max/template/playbtest/playbtest/Info.plist b/max/template/playbtest/playbtest/Info.plist new file mode 100644 index 0000000..46d101b --- /dev/null +++ b/max/template/playbtest/playbtest/Info.plist @@ -0,0 +1,507 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SKAdNetworkItems + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + SKAdNetworkIdentifier + 238da6jt44.skadnetwork + + SKAdNetworkIdentifier + 24t9a8vw3c.skadnetwork + + SKAdNetworkIdentifier + 24zw6aqk47.skadnetwork + + SKAdNetworkIdentifier + 252b5q8x7y.skadnetwork + + SKAdNetworkIdentifier + 275upjj5gd.skadnetwork + + SKAdNetworkIdentifier + 294l99pt4k.skadnetwork + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + SKAdNetworkIdentifier + 32z4fx6l9h.skadnetwork + + SKAdNetworkIdentifier + 3l6bd9hu43.skadnetwork + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + SKAdNetworkIdentifier + 424m5254lk.skadnetwork + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + SKAdNetworkIdentifier + 44jx6755aq.skadnetwork + + SKAdNetworkIdentifier + 44n7hlldy6.skadnetwork + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + SKAdNetworkIdentifier + 488r3q3dtq.skadnetwork + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + SKAdNetworkIdentifier + 4mn522wn87.skadnetwork + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + SKAdNetworkIdentifier + 4w7y6s5ca2.skadnetwork + + SKAdNetworkIdentifier + 523jb4fst2.skadnetwork + + SKAdNetworkIdentifier + 52fl2v3hgk.skadnetwork + + SKAdNetworkIdentifier + 54nzkqm89y.skadnetwork + + SKAdNetworkIdentifier + 55644vm79v.skadnetwork + + SKAdNetworkIdentifier + 55y65gfgn7.skadnetwork + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + SKAdNetworkIdentifier + 5l3tpt7t6e.skadnetwork + + SKAdNetworkIdentifier + 5lm9lj6jb7.skadnetwork + + SKAdNetworkIdentifier + 5tjdwbrq8w.skadnetwork + + SKAdNetworkIdentifier + 6964rsfnh4.skadnetwork + + SKAdNetworkIdentifier + 6g9af3uyq4.skadnetwork + + SKAdNetworkIdentifier + 6p4ks3rnbw.skadnetwork + + SKAdNetworkIdentifier + 6v7lgmsu45.skadnetwork + + SKAdNetworkIdentifier + 6xzpu9s2p8.skadnetwork + + SKAdNetworkIdentifier + 6yxyv74ff7.skadnetwork + + SKAdNetworkIdentifier + 737z793b9f.skadnetwork + + SKAdNetworkIdentifier + 74b6s63p6l.skadnetwork + + SKAdNetworkIdentifier + 7953jerfzd.skadnetwork + + SKAdNetworkIdentifier + 79pbpufp6p.skadnetwork + + SKAdNetworkIdentifier + 7fmhfwg9en.skadnetwork + + SKAdNetworkIdentifier + 7rz58n8ntl.skadnetwork + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + SKAdNetworkIdentifier + 84993kbrcf.skadnetwork + + SKAdNetworkIdentifier + 87u5trcl3r.skadnetwork + + SKAdNetworkIdentifier + 89z7zv988g.skadnetwork + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + SKAdNetworkIdentifier + 8m87ys6875.skadnetwork + + SKAdNetworkIdentifier + 8r8llnkz5a.skadnetwork + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + SKAdNetworkIdentifier + 97r2b46745.skadnetwork + + SKAdNetworkIdentifier + 9b89h5y424.skadnetwork + + SKAdNetworkIdentifier + 9nlqeag3gk.skadnetwork + + SKAdNetworkIdentifier + 9rd848q2bz.skadnetwork + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + SKAdNetworkIdentifier + 9vvzujtq5s.skadnetwork + + SKAdNetworkIdentifier + 9yg77x724h.skadnetwork + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + SKAdNetworkIdentifier + a7xqa6mtl2.skadnetwork + + SKAdNetworkIdentifier + a8cz6cu7e5.skadnetwork + + SKAdNetworkIdentifier + av6w8kgt66.skadnetwork + + SKAdNetworkIdentifier + b9bk5wbcq9.skadnetwork + + SKAdNetworkIdentifier + bvpn9ufa9b.skadnetwork + + SKAdNetworkIdentifier + bxvub5ada5.skadnetwork + + SKAdNetworkIdentifier + c3frkrj4fj.skadnetwork + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + SKAdNetworkIdentifier + cg4yq2srnc.skadnetwork + + SKAdNetworkIdentifier + cj5566h2ga.skadnetwork + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + SKAdNetworkIdentifier + cs644xg564.skadnetwork + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + SKAdNetworkIdentifier + cwn433xbcr.skadnetwork + + SKAdNetworkIdentifier + dbu4b84rxf.skadnetwork + + SKAdNetworkIdentifier + dkc879ngq3.skadnetwork + + SKAdNetworkIdentifier + dzg6xy7pwj.skadnetwork + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + SKAdNetworkIdentifier + ejvt5qm6ak.skadnetwork + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + SKAdNetworkIdentifier + f73kdq92p3.skadnetwork + + SKAdNetworkIdentifier + f7s53z58qe.skadnetwork + + SKAdNetworkIdentifier + feyaarzu9v.skadnetwork + + SKAdNetworkIdentifier + fq6vru337s.skadnetwork + + SKAdNetworkIdentifier + fz2k2k5tej.skadnetwork + + SKAdNetworkIdentifier + g28c52eehv.skadnetwork + + SKAdNetworkIdentifier + g2y4y55b64.skadnetwork + + SKAdNetworkIdentifier + g6gcrrvk4p.skadnetwork + + SKAdNetworkIdentifier + ggvn48r87g.skadnetwork + + SKAdNetworkIdentifier + glqzh8vgby.skadnetwork + + SKAdNetworkIdentifier + gta8lk7p23.skadnetwork + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + SKAdNetworkIdentifier + hb56zgv37p.skadnetwork + + SKAdNetworkIdentifier + hdw39hrw9y.skadnetwork + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + SKAdNetworkIdentifier + k674qkevps.skadnetwork + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + SKAdNetworkIdentifier + kbmxgpxpgc.skadnetwork + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + SKAdNetworkIdentifier + krvm3zuq6h.skadnetwork + + SKAdNetworkIdentifier + lr83yxwka7.skadnetwork + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + SKAdNetworkIdentifier + m297p6643m.skadnetwork + + SKAdNetworkIdentifier + m5mvw97r93.skadnetwork + + SKAdNetworkIdentifier + m8dbw4sv7c.skadnetwork + + SKAdNetworkIdentifier + mj797d8u6f.skadnetwork + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + SKAdNetworkIdentifier + mls7yz5dvl.skadnetwork + + SKAdNetworkIdentifier + mp6xlyr22a.skadnetwork + + SKAdNetworkIdentifier + mqn7fxpca7.skadnetwork + + SKAdNetworkIdentifier + mtkv5xtk9e.skadnetwork + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + SKAdNetworkIdentifier + n66cz3y3bx.skadnetwork + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + SKAdNetworkIdentifier + n9x2a789qt.skadnetwork + + SKAdNetworkIdentifier + ns5j362hk7.skadnetwork + + SKAdNetworkIdentifier + nzq8sh4pbs.skadnetwork + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + SKAdNetworkIdentifier + prcb7njmu6.skadnetwork + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + SKAdNetworkIdentifier + pwdxu55a5a.skadnetwork + + SKAdNetworkIdentifier + qqp299437r.skadnetwork + + SKAdNetworkIdentifier + qu637u8glc.skadnetwork + + SKAdNetworkIdentifier + r45fhb6rf7.skadnetwork + + SKAdNetworkIdentifier + rvh3l7un93.skadnetwork + + SKAdNetworkIdentifier + rx5hdcabgc.skadnetwork + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + SKAdNetworkIdentifier + s69wq72ugq.skadnetwork + + SKAdNetworkIdentifier + su67r6k2v3.skadnetwork + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + SKAdNetworkIdentifier + t6d3zquu66.skadnetwork + + SKAdNetworkIdentifier + tl55sbb4fm.skadnetwork + + SKAdNetworkIdentifier + tmhh9296z4.skadnetwork + + SKAdNetworkIdentifier + u679fj5vs4.skadnetwork + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + SKAdNetworkIdentifier + v79kvwwj4g.skadnetwork + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + SKAdNetworkIdentifier + vcra2ehyfk.skadnetwork + + SKAdNetworkIdentifier + vhf287vqwu.skadnetwork + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + SKAdNetworkIdentifier + w9q455wk68.skadnetwork + + SKAdNetworkIdentifier + wg4vff78zm.skadnetwork + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + SKAdNetworkIdentifier + x44k69ngh6.skadnetwork + + SKAdNetworkIdentifier + x5l83yy675.skadnetwork + + SKAdNetworkIdentifier + x8jxxk4ff5.skadnetwork + + SKAdNetworkIdentifier + x8uqf25wch.skadnetwork + + SKAdNetworkIdentifier + xga6mpmplv.skadnetwork + + SKAdNetworkIdentifier + xy9t38ct57.skadnetwork + + SKAdNetworkIdentifier + y45688jllp.skadnetwork + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + SKAdNetworkIdentifier + zmvfpc5aq8.skadnetwork + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + + diff --git a/max/template/playbtest/playbtest/PlayB/CocoaAsyncSocket.h b/max/template/playbtest/playbtest/PlayB/CocoaAsyncSocket.h new file mode 100755 index 0000000..b7ac3b3 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/CocoaAsyncSocket.h @@ -0,0 +1,19 @@ +// +// CocoaAsyncSocket.h +// CocoaAsyncSocket +// +// Created by Derek Clarkson on 10/08/2015. +// CocoaAsyncSocket project is in the public domain. +// + +#import + +//! Project version number for CocoaAsyncSocket. +FOUNDATION_EXPORT double cocoaAsyncSocketVersionNumber; + +//! Project version string for CocoaAsyncSocket. +FOUNDATION_EXPORT const unsigned char cocoaAsyncSocketVersionString[]; + + +#import "GCD/GCDAsyncUdpSocket.h" + diff --git a/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.h b/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.h new file mode 100755 index 0000000..af327e0 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.h @@ -0,0 +1,1036 @@ +// +// GCDAsyncUdpSocket +// +// This class is in the public domain. +// Originally created by Robbie Hanson of Deusty LLC. +// Updated and maintained by Deusty LLC and the Apple development community. +// +// https://github.com/robbiehanson/CocoaAsyncSocket +// + +#import +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN +extern NSString *const GCDAsyncUdpSocketException; +extern NSString *const GCDAsyncUdpSocketErrorDomain; + +extern NSString *const GCDAsyncUdpSocketQueueName; +extern NSString *const GCDAsyncUdpSocketThreadName; + +typedef NS_ERROR_ENUM(GCDAsyncUdpSocketErrorDomain, GCDAsyncUdpSocketError) { + GCDAsyncUdpSocketNoError = 0, // Never used + GCDAsyncUdpSocketBadConfigError, // Invalid configuration + GCDAsyncUdpSocketBadParamError, // Invalid parameter was passed + GCDAsyncUdpSocketSendTimeoutError, // A send operation timed out + GCDAsyncUdpSocketClosedError, // The socket was closed + GCDAsyncUdpSocketOtherError, // Description provided in userInfo +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@class GCDAsyncUdpSocket; + +@protocol GCDAsyncUdpSocketDelegate +@optional + +/** + * By design, UDP is a connectionless protocol, and connecting is not needed. + * However, you may optionally choose to connect to a particular host for reasons + * outlined in the documentation for the various connect methods listed above. + * + * This method is called if one of the connect methods are invoked, and the connection is successful. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address; + +/** + * By design, UDP is a connectionless protocol, and connecting is not needed. + * However, you may optionally choose to connect to a particular host for reasons + * outlined in the documentation for the various connect methods listed above. + * + * This method is called if one of the connect methods are invoked, and the connection fails. + * This may happen, for example, if a domain name is given for the host and the domain name is unable to be resolved. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error; + +/** + * Called when the datagram with the given tag has been sent. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag; + +/** + * Called if an error occurs while trying to send a datagram. + * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error; + +/** + * Called when the socket has received the requested datagram. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data + fromAddress:(NSData *)address + withFilterContext:(nullable id)filterContext; + +/** + * Called when the socket is closed. +**/ +- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError * _Nullable)error; + +@end + +/** + * You may optionally set a receive filter for the socket. + * A filter can provide several useful features: + * + * 1. Many times udp packets need to be parsed. + * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. + * The end result is a parallel socket io, datagram parsing, and packet processing. + * + * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. + * The filter can prevent such packets from arriving at the delegate. + * And because the filter can run in its own independent queue, this doesn't slow down the delegate. + * + * - Since the udp protocol does not guarantee delivery, udp packets may be lost. + * Many protocols built atop udp thus provide various resend/re-request algorithms. + * This sometimes results in duplicate packets arriving. + * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. + * + * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. + * Such packets need to be ignored. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * @param data - The packet that was received. + * @param address - The address the data was received from. + * See utilities section for methods to extract info from address. + * @param context - Out parameter you may optionally set, which will then be passed to the delegate method. + * For example, filter block can parse the data and then, + * pass the parsed data to the delegate. + * + * @returns - YES if the received packet should be passed onto the delegate. + * NO if the received packet should be discarded, and not reported to the delegete. + * + * Example: + * + * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { + * + * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; + * + * *context = response; + * return (response != nil); + * }; + * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; + * +**/ +typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *address, id __nullable * __nonnull context); + +/** + * You may optionally set a send filter for the socket. + * A filter can provide several interesting possibilities: + * + * 1. Optional caching of resolved addresses for domain names. + * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. + * + * 2. Reusable modules of code for bandwidth monitoring. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * @param data - The packet that was received. + * @param address - The address the data was received from. + * See utilities section for methods to extract info from address. + * @param tag - The tag that was passed in the send method. + * + * @returns - YES if the packet should actually be sent over the socket. + * NO if the packet should be silently dropped (not sent over the socket). + * + * Regardless of the return value, the delegate will be informed that the packet was successfully sent. + * +**/ +typedef BOOL (^GCDAsyncUdpSocketSendFilterBlock)(NSData *data, NSData *address, long tag); + + +@interface GCDAsyncUdpSocket : NSObject + +/** + * GCDAsyncUdpSocket uses the standard delegate paradigm, + * but executes all delegate callbacks on a given delegate dispatch queue. + * This allows for maximum concurrency, while at the same time providing easy thread safety. + * + * You MUST set a delegate AND delegate dispatch queue before attempting to + * use the socket, or you will get an error. + * + * The socket queue is optional. + * If you pass NULL, GCDAsyncSocket will automatically create its own socket queue. + * If you choose to provide a socket queue, the socket queue must not be a concurrent queue, + * then please see the discussion for the method markSocketQueueTargetQueue. + * + * The delegate queue and socket queue can optionally be the same. +**/ +- (instancetype)init; +- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; +- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; +- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; + +#pragma mark Configuration + +- (nullable id)delegate; +- (void)setDelegate:(nullable id)delegate; +- (void)synchronouslySetDelegate:(nullable id)delegate; + +- (nullable dispatch_queue_t)delegateQueue; +- (void)setDelegateQueue:(nullable dispatch_queue_t)delegateQueue; +- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; + +- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; +- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; +- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; + +/** + * By default, both IPv4 and IPv6 are enabled. + * + * This means GCDAsyncUdpSocket automatically supports both protocols, + * and can send to IPv4 or IPv6 addresses, + * as well as receive over IPv4 and IPv6. + * + * For operations that require DNS resolution, GCDAsyncUdpSocket supports both IPv4 and IPv6. + * If a DNS lookup returns only IPv4 results, GCDAsyncUdpSocket will automatically use IPv4. + * If a DNS lookup returns only IPv6 results, GCDAsyncUdpSocket will automatically use IPv6. + * If a DNS lookup returns both IPv4 and IPv6 results, then the protocol used depends on the configured preference. + * If IPv4 is preferred, then IPv4 is used. + * If IPv6 is preferred, then IPv6 is used. + * If neutral, then the first IP version in the resolved array will be used. + * + * Starting with Mac OS X 10.7 Lion and iOS 5, the default IP preference is neutral. + * On prior systems the default IP preference is IPv4. + **/ +- (BOOL)isIPv4Enabled; +- (void)setIPv4Enabled:(BOOL)flag; + +- (BOOL)isIPv6Enabled; +- (void)setIPv6Enabled:(BOOL)flag; + +- (BOOL)isIPv4Preferred; +- (BOOL)isIPv6Preferred; +- (BOOL)isIPVersionNeutral; + +- (void)setPreferIPv4; +- (void)setPreferIPv6; +- (void)setIPVersionNeutral; + +/** + * Gets/Sets the maximum size of the buffer that will be allocated for receive operations. + * The default maximum size is 65535 bytes. + * + * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. + * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. + * + * Since the OS/GCD notifies us of the size of each received UDP packet, + * the actual allocated buffer size for each packet is exact. + * And in practice the size of UDP packets is generally much smaller than the max. + * Indeed most protocols will send and receive packets of only a few bytes, + * or will set a limit on the size of packets to prevent fragmentation in the IP layer. + * + * If you set the buffer size too small, the sockets API in the OS will silently discard + * any extra data, and you will not be notified of the error. +**/ +- (uint16_t)maxReceiveIPv4BufferSize; +- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max; + +- (uint32_t)maxReceiveIPv6BufferSize; +- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max; + +/** + * Gets/Sets the maximum size of the buffer that will be allocated for send operations. + * The default maximum size is 65535 bytes. + * + * Given that a typical link MTU is 1500 bytes, a large UDP datagram will have to be + * fragmented, and that’s both expensive and risky (if one fragment goes missing, the + * entire datagram is lost). You are much better off sending a large number of smaller + * UDP datagrams, preferably using a path MTU algorithm to avoid fragmentation. + * + * You must set it before the sockt is created otherwise it won't work. + * + **/ +- (uint16_t)maxSendBufferSize; +- (void)setMaxSendBufferSize:(uint16_t)max; + +/** + * User data allows you to associate arbitrary information with the socket. + * This data is not used internally in any way. +**/ +- (nullable id)userData; +- (void)setUserData:(nullable id)arbitraryUserData; + +#pragma mark Diagnostics + +/** + * Returns the local address info for the socket. + * + * The localAddress method returns a sockaddr structure wrapped in a NSData object. + * The localHost method returns the human readable IP address as a string. + * + * Note: Address info may not be available until after the socket has been binded, connected + * or until after data has been sent. +**/ +- (nullable NSData *)localAddress; +- (nullable NSString *)localHost; +- (uint16_t)localPort; + +- (nullable NSData *)localAddress_IPv4; +- (nullable NSString *)localHost_IPv4; +- (uint16_t)localPort_IPv4; + +- (nullable NSData *)localAddress_IPv6; +- (nullable NSString *)localHost_IPv6; +- (uint16_t)localPort_IPv6; + +/** + * Returns the remote address info for the socket. + * + * The connectedAddress method returns a sockaddr structure wrapped in a NSData object. + * The connectedHost method returns the human readable IP address as a string. + * + * Note: Since UDP is connectionless by design, connected address info + * will not be available unless the socket is explicitly connected to a remote host/port. + * If the socket is not connected, these methods will return nil / 0. +**/ +- (nullable NSData *)connectedAddress; +- (nullable NSString *)connectedHost; +- (uint16_t)connectedPort; + +/** + * Returns whether or not this socket has been connected to a single host. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * If connected, the socket will only be able to send/receive data to/from the connected host. +**/ +- (BOOL)isConnected; + +/** + * Returns whether or not this socket has been closed. + * The only way a socket can be closed is if you explicitly call one of the close methods. +**/ +- (BOOL)isClosed; + +/** + * Returns whether or not this socket is IPv4. + * + * By default this will be true, unless: + * - IPv4 is disabled (via setIPv4Enabled:) + * - The socket is explicitly bound to an IPv6 address + * - The socket is connected to an IPv6 address +**/ +- (BOOL)isIPv4; + +/** + * Returns whether or not this socket is IPv6. + * + * By default this will be true, unless: + * - IPv6 is disabled (via setIPv6Enabled:) + * - The socket is explicitly bound to an IPv4 address + * _ The socket is connected to an IPv4 address + * + * This method will also return false on platforms that do not support IPv6. + * Note: The iPhone does not currently support IPv6. +**/ +- (BOOL)isIPv6; + +#pragma mark Binding + +/** + * Binds the UDP socket to the given port. + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You may optionally pass a port number of zero to immediately bind the socket, + * yet still allow the OS to automatically assign an available port. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr; + +/** + * Binds the UDP socket to the given port and optional interface. + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You may optionally pass a port number of zero to immediately bind the socket, + * yet still allow the OS to automatically assign an available port. + * + * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). + * You may also use the special strings "localhost" or "loopback" to specify that + * the socket only accept packets from the local machine. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToPort:(uint16_t)port interface:(nullable NSString *)interface error:(NSError **)errPtr; + +/** + * Binds the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. + * + * If you have an existing struct sockaddr you can convert it to a NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; + * + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr; + +#pragma mark Connecting + +/** + * Connects the UDP socket to the given host and port. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * + * Choosing to connect to a specific host/port has the following effect: + * - You will only be able to send data to the connected host/port. + * - You will only be able to receive data from the connected host/port. + * - You will receive ICMP messages that come from the connected host/port, such as "connection refused". + * + * The actual process of connecting a UDP socket does not result in any communication on the socket. + * It simply changes the internal state of the socket. + * + * You cannot bind a socket after it has been connected. + * You can only connect a socket once. + * + * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). + * + * This method is asynchronous as it requires a DNS lookup to resolve the given host name. + * If an obvious error is detected, this method immediately returns NO and sets errPtr. + * If you don't care about the error, you can pass nil for errPtr. + * Otherwise, this method returns YES and begins the asynchronous connection process. + * The result of the asynchronous connection process will be reported via the delegate methods. + **/ +- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; + +/** + * Connects the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. + * + * If you have an existing struct sockaddr you can convert it to a NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; + * + * By design, UDP is a connectionless protocol, and connecting is not needed. + * + * Choosing to connect to a specific address has the following effect: + * - You will only be able to send data to the connected address. + * - You will only be able to receive data from the connected address. + * - You will receive ICMP messages that come from the connected address, such as "connection refused". + * + * Connecting a UDP socket does not result in any communication on the socket. + * It simply changes the internal state of the socket. + * + * You cannot bind a socket after its been connected. + * You can only connect a socket once. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. + * + * Note: Unlike the connectToHost:onPort:error: method, this method does not require a DNS lookup. + * Thus when this method returns, the connection has either failed or fully completed. + * In other words, this method is synchronous, unlike the asynchronous connectToHost::: method. + * However, for compatibility and simplification of delegate code, if this method returns YES + * then the corresponding delegate method (udpSocket:didConnectToHost:port:) is still invoked. +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; + +#pragma mark Multicast + +/** + * Join multicast group. + * Group should be an IP address (eg @"225.228.0.1"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr; + +/** + * Join multicast group. + * Group should be an IP address (eg @"225.228.0.1"). + * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; + +- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr; +- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; + +/** + * Send multicast on a specified interface. + * For IPv4, interface should be the the IP address of the interface (eg @"192.168.10.1"). + * For IPv6, interface should be the a network interface name (eg @"en0"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ + +- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; +- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; + +#pragma mark Reuse Port + +/** + * By default, only one socket can be bound to a given IP address + port at a time. + * To enable multiple processes to simultaneously bind to the same address+port, + * you need to enable this functionality in the socket. All processes that wish to + * use the address+port simultaneously must all enable reuse port on the socket + * bound to that port. + **/ +- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr; + +#pragma mark Broadcast + +/** + * By default, the underlying socket in the OS will not allow you to send broadcast messages. + * In order to send broadcast messages, you need to enable this functionality in the socket. + * + * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is + * delivered to every host on the network. + * The reason this is generally disabled by default (by the OS) is to prevent + * accidental broadcast messages from flooding the network. +**/ +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr; + +#pragma mark Sending + +/** + * Asynchronously sends the given data, with the given timeout and tag. + * + * This method may only be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given host and port. + * + * This method cannot be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param host + * The destination to send the udp packet to. + * May be specified as a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). + * You may also use the convenience strings of "loopback" or "localhost". + * + * @param port + * The port of the host to send to. + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data + toHost:(NSString *)host + port:(uint16_t)port + withTimeout:(NSTimeInterval)timeout + tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given address. + * + * This method cannot be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param remoteAddr + * The address to send the data to (specified as a sockaddr structure wrapped in a NSData object). + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * You may optionally set a send filter for the socket. + * A filter can provide several interesting possibilities: + * + * 1. Optional caching of resolved addresses for domain names. + * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. + * + * 2. Reusable modules of code for bandwidth monitoring. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * For more information about GCDAsyncUdpSocketSendFilterBlock, see the documentation for its typedef. + * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. + * + * Note: This method invokes setSendFilter:withQueue:isAsynchronous: (documented below), + * passing YES for the isAsynchronous parameter. +**/ +- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; + +/** + * The receive filter can be run via dispatch_async or dispatch_sync. + * Most typical situations call for asynchronous operation. + * + * However, there are a few situations in which synchronous operation is preferred. + * Such is the case when the filter is extremely minimal and fast. + * This is because dispatch_sync is faster than dispatch_async. + * + * If you choose synchronous operation, be aware of possible deadlock conditions. + * Since the socket queue is executing your block via dispatch_sync, + * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. + * For example, you can't query properties on the socket. +**/ +- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock + withQueue:(nullable dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous; + +#pragma mark Receiving + +/** + * There are two modes of operation for receiving packets: one-at-a-time & continuous. + * + * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. + * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, + * where your state machine may not always be ready to process incoming packets. + * + * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. + * Receiving packets continuously is better suited to real-time streaming applications. + * + * You may switch back and forth between one-at-a-time mode and continuous mode. + * If the socket is currently in continuous mode, calling this method will switch it to one-at-a-time mode. + * + * When a packet is received (and not filtered by the optional receive filter), + * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. + * + * If the socket is able to begin receiving packets, this method returns YES. + * Otherwise it returns NO, and sets the errPtr with appropriate error information. + * + * An example error: + * You created a udp socket to act as a server, and immediately called receive. + * You forgot to first bind the socket to a port number, and received a error with a message like: + * "Must bind socket before you can receive data." +**/ +- (BOOL)receiveOnce:(NSError **)errPtr; + +/** + * There are two modes of operation for receiving packets: one-at-a-time & continuous. + * + * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. + * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, + * where your state machine may not always be ready to process incoming packets. + * + * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. + * Receiving packets continuously is better suited to real-time streaming applications. + * + * You may switch back and forth between one-at-a-time mode and continuous mode. + * If the socket is currently in one-at-a-time mode, calling this method will switch it to continuous mode. + * + * For every received packet (not filtered by the optional receive filter), + * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. + * + * If the socket is able to begin receiving packets, this method returns YES. + * Otherwise it returns NO, and sets the errPtr with appropriate error information. + * + * An example error: + * You created a udp socket to act as a server, and immediately called receive. + * You forgot to first bind the socket to a port number, and received a error with a message like: + * "Must bind socket before you can receive data." +**/ +- (BOOL)beginReceiving:(NSError **)errPtr; + +/** + * If the socket is currently receiving (beginReceiving has been called), this method pauses the receiving. + * That is, it won't read any more packets from the underlying OS socket until beginReceiving is called again. + * + * Important Note: + * GCDAsyncUdpSocket may be running in parallel with your code. + * That is, your delegate is likely running on a separate thread/dispatch_queue. + * When you invoke this method, GCDAsyncUdpSocket may have already dispatched delegate methods to be invoked. + * Thus, if those delegate methods have already been dispatch_async'd, + * your didReceive delegate method may still be invoked after this method has been called. + * You should be aware of this, and program defensively. +**/ +- (void)pauseReceiving; + +/** + * You may optionally set a receive filter for the socket. + * This receive filter may be set to run in its own queue (independent of delegate queue). + * + * A filter can provide several useful features. + * + * 1. Many times udp packets need to be parsed. + * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. + * The end result is a parallel socket io, datagram parsing, and packet processing. + * + * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. + * The filter can prevent such packets from arriving at the delegate. + * And because the filter can run in its own independent queue, this doesn't slow down the delegate. + * + * - Since the udp protocol does not guarantee delivery, udp packets may be lost. + * Many protocols built atop udp thus provide various resend/re-request algorithms. + * This sometimes results in duplicate packets arriving. + * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. + * + * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. + * Such packets need to be ignored. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * Example: + * + * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { + * + * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; + * + * *context = response; + * return (response != nil); + * }; + * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; + * + * For more information about GCDAsyncUdpSocketReceiveFilterBlock, see the documentation for its typedef. + * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. + * + * Note: This method invokes setReceiveFilter:withQueue:isAsynchronous: (documented below), + * passing YES for the isAsynchronous parameter. +**/ +- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; + +/** + * The receive filter can be run via dispatch_async or dispatch_sync. + * Most typical situations call for asynchronous operation. + * + * However, there are a few situations in which synchronous operation is preferred. + * Such is the case when the filter is extremely minimal and fast. + * This is because dispatch_sync is faster than dispatch_async. + * + * If you choose synchronous operation, be aware of possible deadlock conditions. + * Since the socket queue is executing your block via dispatch_sync, + * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. + * For example, you can't query properties on the socket. +**/ +- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock + withQueue:(nullable dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous; + +#pragma mark Closing + +/** + * Immediately closes the underlying socket. + * Any pending send operations are discarded. + * + * The GCDAsyncUdpSocket instance may optionally be used again. + * (it will setup/configure/use another unnderlying BSD socket). +**/ +- (void)close; + +/** + * Closes the underlying socket after all pending send operations have been sent. + * + * The GCDAsyncUdpSocket instance may optionally be used again. + * (it will setup/configure/use another unnderlying BSD socket). +**/ +- (void)closeAfterSending; + +#pragma mark Advanced +/** + * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. + * In most cases, the instance creates this queue itself. + * However, to allow for maximum flexibility, the internal queue may be passed in the init method. + * This allows for some advanced options such as controlling socket priority via target queues. + * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. + * + * For example, imagine there are 2 queues: + * dispatch_queue_t socketQueue; + * dispatch_queue_t socketTargetQueue; + * + * If you do this (pseudo-code): + * socketQueue.targetQueue = socketTargetQueue; + * + * Then all socketQueue operations will actually get run on the given socketTargetQueue. + * This is fine and works great in most situations. + * But if you run code directly from within the socketTargetQueue that accesses the socket, + * you could potentially get deadlock. Imagine the following code: + * + * - (BOOL)socketHasSomething + * { + * __block BOOL result = NO; + * dispatch_block_t block = ^{ + * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; + * } + * if (is_executing_on_queue(socketQueue)) + * block(); + * else + * dispatch_sync(socketQueue, block); + * + * return result; + * } + * + * What happens if you call this method from the socketTargetQueue? The result is deadlock. + * This is because the GCD API offers no mechanism to discover a queue's targetQueue. + * Thus we have no idea if our socketQueue is configured with a targetQueue. + * If we had this information, we could easily avoid deadlock. + * But, since these API's are missing or unfeasible, you'll have to explicitly set it. + * + * IF you pass a socketQueue via the init method, + * AND you've configured the passed socketQueue with a targetQueue, + * THEN you should pass the end queue in the target hierarchy. + * + * For example, consider the following queue hierarchy: + * socketQueue -> ipQueue -> moduleQueue + * + * This example demonstrates priority shaping within some server. + * All incoming client connections from the same IP address are executed on the same target queue. + * And all connections for a particular module are executed on the same target queue. + * Thus, the priority of all networking for the entire module can be changed on the fly. + * Additionally, networking traffic from a single IP cannot monopolize the module. + * + * Here's how you would accomplish something like that: + * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock + * { + * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); + * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; + * + * dispatch_set_target_queue(socketQueue, ipQueue); + * dispatch_set_target_queue(iqQueue, moduleQueue); + * + * return socketQueue; + * } + * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket + * { + * [clientConnections addObject:newSocket]; + * [newSocket markSocketQueueTargetQueue:moduleQueue]; + * } + * + * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. + * This is often NOT the case, as such queues are used solely for execution shaping. + **/ +- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; +- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; + +/** + * It's not thread-safe to access certain variables from outside the socket's internal queue. + * + * For example, the socket file descriptor. + * File descriptors are simply integers which reference an index in the per-process file table. + * However, when one requests a new file descriptor (by opening a file or socket), + * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. + * So if we're not careful, the following could be possible: + * + * - Thread A invokes a method which returns the socket's file descriptor. + * - The socket is closed via the socket's internal queue on thread B. + * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. + * - Thread A is now accessing/altering the file instead of the socket. + * + * In addition to this, other variables are not actually objects, + * and thus cannot be retained/released or even autoreleased. + * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. + * + * Although there are internal variables that make it difficult to maintain thread-safety, + * it is important to provide access to these variables + * to ensure this class can be used in a wide array of environments. + * This method helps to accomplish this by invoking the current block on the socket's internal queue. + * The methods below can be invoked from within the block to access + * those generally thread-unsafe internal variables in a thread-safe manner. + * The given block will be invoked synchronously on the socket's internal queue. + * + * If you save references to any protected variables and use them outside the block, you do so at your own peril. +**/ +- (void)performBlock:(dispatch_block_t)block; + +/** + * These methods are only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Provides access to the socket's file descriptor(s). + * If the socket isn't connected, or explicity bound to a particular interface, + * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. +**/ +- (int)socketFD; +- (int)socket4FD; +- (int)socket6FD; + +#if TARGET_OS_IPHONE + +/** + * These methods are only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Returns (creating if necessary) a CFReadStream/CFWriteStream for the internal socket. + * + * Generally GCDAsyncUdpSocket doesn't use CFStream. (It uses the faster GCD API's.) + * However, if you need one for any reason, + * these methods are a convenient way to get access to a safe instance of one. +**/ +- (nullable CFReadStreamRef)readStream; +- (nullable CFWriteStreamRef)writeStream; + +/** + * This method is only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Configures the socket to allow it to operate when the iOS application has been backgrounded. + * In other words, this method creates a read & write stream, and invokes: + * + * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * + * Returns YES if successful, NO otherwise. + * + * Example usage: + * + * [asyncUdpSocket performBlock:^{ + * [asyncUdpSocket enableBackgroundingOnSocket]; + * }]; + * + * + * NOTE : Apple doesn't currently support backgrounding UDP sockets. (Only TCP for now). +**/ +//- (BOOL)enableBackgroundingOnSockets; + +#endif + +#pragma mark Utilities + +/** + * Extracting host/port/family information from raw address data. +**/ + ++ (nullable NSString *)hostFromAddress:(NSData *)address; ++ (uint16_t)portFromAddress:(NSData *)address; ++ (int)familyFromAddress:(NSData *)address; + ++ (BOOL)isIPv4Address:(NSData *)address; ++ (BOOL)isIPv6Address:(NSData *)address; + ++ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr fromAddress:(NSData *)address; ++ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr family:(int * __nullable)afPtr fromAddress:(NSData *)address; + +@end + +NS_ASSUME_NONNULL_END diff --git a/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.m b/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.m new file mode 100755 index 0000000..af0cbf2 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/GCD/GCDAsyncUdpSocket.m @@ -0,0 +1,5632 @@ +// +// GCDAsyncUdpSocket +// +// This class is in the public domain. +// Originally created by Robbie Hanson of Deusty LLC. +// Updated and maintained by Deusty LLC and the Apple development community. +// +// https://github.com/robbiehanson/CocoaAsyncSocket +// + +#import "GCDAsyncUdpSocket.h" + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +// For more information see: https://github.com/robbiehanson/CocoaAsyncSocket/wiki/ARC +#endif + +#if TARGET_OS_IPHONE + #import + #import +#endif + +#import +#import +#import +#import +#import +#import +#import + + +#if 0 + +// Logging Enabled - See log level below + +// Logging uses the CocoaLumberjack framework (which is also GCD based). +// https://github.com/robbiehanson/CocoaLumberjack +// +// It allows us to do a lot of logging without significantly slowing down the code. +#import "DDLog.h" + +#define LogAsync NO +#define LogContext 65535 + +#define LogObjc(flg, frmt, ...) LOG_OBJC_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) +#define LogC(flg, frmt, ...) LOG_C_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) + +#define LogError(frmt, ...) LogObjc(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogWarn(frmt, ...) LogObjc(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogInfo(frmt, ...) LogObjc(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogVerbose(frmt, ...) LogObjc(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) + +#define LogCError(frmt, ...) LogC(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCWarn(frmt, ...) LogC(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCInfo(frmt, ...) LogC(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCVerbose(frmt, ...) LogC(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) + +#define LogTrace() LogObjc(LOG_FLAG_VERBOSE, @"%@: %@", THIS_FILE, THIS_METHOD) +#define LogCTrace() LogC(LOG_FLAG_VERBOSE, @"%@: %s", THIS_FILE, __FUNCTION__) + +// Log levels : off, error, warn, info, verbose +static const int logLevel = LOG_LEVEL_VERBOSE; + +#else + +// Logging Disabled + +#define LogError(frmt, ...) {} +#define LogWarn(frmt, ...) {} +#define LogInfo(frmt, ...) {} +#define LogVerbose(frmt, ...) {} + +#define LogCError(frmt, ...) {} +#define LogCWarn(frmt, ...) {} +#define LogCInfo(frmt, ...) {} +#define LogCVerbose(frmt, ...) {} + +#define LogTrace() {} +#define LogCTrace(frmt, ...) {} + +#endif + +/** + * Seeing a return statements within an inner block + * can sometimes be mistaken for a return point of the enclosing method. + * This makes inline blocks a bit easier to read. +**/ +#define return_from_block return + +/** + * A socket file descriptor is really just an integer. + * It represents the index of the socket within the kernel. + * This makes invalid file descriptor comparisons easier to read. +**/ +#define SOCKET_NULL -1 + +/** + * Just to type less code. +**/ +#define AutoreleasedBlock(block) ^{ @autoreleasepool { block(); }} + + +@class GCDAsyncUdpSendPacket; + +NSString *const GCDAsyncUdpSocketException = @"GCDAsyncUdpSocketException"; +NSString *const GCDAsyncUdpSocketErrorDomain = @"GCDAsyncUdpSocketErrorDomain"; + +NSString *const GCDAsyncUdpSocketQueueName = @"GCDAsyncUdpSocket"; +NSString *const GCDAsyncUdpSocketThreadName = @"GCDAsyncUdpSocket-CFStream"; + +enum GCDAsyncUdpSocketFlags +{ + kDidCreateSockets = 1 << 0, // If set, the sockets have been created. + kDidBind = 1 << 1, // If set, bind has been called. + kConnecting = 1 << 2, // If set, a connection attempt is in progress. + kDidConnect = 1 << 3, // If set, socket is connected. + kReceiveOnce = 1 << 4, // If set, one-at-a-time receive is enabled + kReceiveContinuous = 1 << 5, // If set, continuous receive is enabled + kIPv4Deactivated = 1 << 6, // If set, socket4 was closed due to bind or connect on IPv6. + kIPv6Deactivated = 1 << 7, // If set, socket6 was closed due to bind or connect on IPv4. + kSend4SourceSuspended = 1 << 8, // If set, send4Source is suspended. + kSend6SourceSuspended = 1 << 9, // If set, send6Source is suspended. + kReceive4SourceSuspended = 1 << 10, // If set, receive4Source is suspended. + kReceive6SourceSuspended = 1 << 11, // If set, receive6Source is suspended. + kSock4CanAcceptBytes = 1 << 12, // If set, we know socket4 can accept bytes. If unset, it's unknown. + kSock6CanAcceptBytes = 1 << 13, // If set, we know socket6 can accept bytes. If unset, it's unknown. + kForbidSendReceive = 1 << 14, // If set, no new send or receive operations are allowed to be queued. + kCloseAfterSends = 1 << 15, // If set, close as soon as no more sends are queued. + kFlipFlop = 1 << 16, // Used to alternate between IPv4 and IPv6 sockets. +#if TARGET_OS_IPHONE + kAddedStreamListener = 1 << 17, // If set, CFStreams have been added to listener thread +#endif +}; + +enum GCDAsyncUdpSocketConfig +{ + kIPv4Disabled = 1 << 0, // If set, IPv4 is disabled + kIPv6Disabled = 1 << 1, // If set, IPv6 is disabled + kPreferIPv4 = 1 << 2, // If set, IPv4 is preferred over IPv6 + kPreferIPv6 = 1 << 3, // If set, IPv6 is preferred over IPv4 +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface GCDAsyncUdpSocket () +{ +#if __has_feature(objc_arc_weak) + __weak id delegate; +#else + __unsafe_unretained id delegate; +#endif + dispatch_queue_t delegateQueue; + + GCDAsyncUdpSocketReceiveFilterBlock receiveFilterBlock; + dispatch_queue_t receiveFilterQueue; + BOOL receiveFilterAsync; + + GCDAsyncUdpSocketSendFilterBlock sendFilterBlock; + dispatch_queue_t sendFilterQueue; + BOOL sendFilterAsync; + + uint32_t flags; + uint16_t config; + + uint16_t max4ReceiveSize; + uint32_t max6ReceiveSize; + + uint16_t maxSendSize; + + int socket4FD; + int socket6FD; + + dispatch_queue_t socketQueue; + + dispatch_source_t send4Source; + dispatch_source_t send6Source; + dispatch_source_t receive4Source; + dispatch_source_t receive6Source; + dispatch_source_t sendTimer; + + GCDAsyncUdpSendPacket *currentSend; + NSMutableArray *sendQueue; + + unsigned long socket4FDBytesAvailable; + unsigned long socket6FDBytesAvailable; + + uint32_t pendingFilterOperations; + + NSData *cachedLocalAddress4; + NSString *cachedLocalHost4; + uint16_t cachedLocalPort4; + + NSData *cachedLocalAddress6; + NSString *cachedLocalHost6; + uint16_t cachedLocalPort6; + + NSData *cachedConnectedAddress; + NSString *cachedConnectedHost; + uint16_t cachedConnectedPort; + int cachedConnectedFamily; + + void *IsOnSocketQueueOrTargetQueueKey; + +#if TARGET_OS_IPHONE + CFStreamClientContext streamContext; + CFReadStreamRef readStream4; + CFReadStreamRef readStream6; + CFWriteStreamRef writeStream4; + CFWriteStreamRef writeStream6; +#endif + + id userData; +} + +- (void)resumeSend4Source; +- (void)resumeSend6Source; +- (void)resumeReceive4Source; +- (void)resumeReceive6Source; +- (void)closeSockets; + +- (void)maybeConnect; +- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr; +- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr; + +- (void)maybeDequeueSend; +- (void)doPreSend; +- (void)doSend; +- (void)endCurrentSend; +- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout; + +- (void)doReceive; +- (void)doReceiveEOF; + +- (void)closeWithError:(NSError *)error; + +- (BOOL)performMulticastRequest:(int)requestType forGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr; + +#if TARGET_OS_IPHONE +- (BOOL)createReadAndWriteStreams:(NSError **)errPtr; +- (BOOL)registerForStreamCallbacks:(NSError **)errPtr; +- (BOOL)addStreamsToRunLoop:(NSError **)errPtr; +- (BOOL)openStreams:(NSError **)errPtr; +- (void)removeStreamsFromRunLoop; +- (void)closeReadAndWriteStreams; +#endif + ++ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; ++ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; ++ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; ++ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; + +#if TARGET_OS_IPHONE +// Forward declaration ++ (void)listenerThread:(id)unused; +#endif + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The GCDAsyncUdpSendPacket encompasses the instructions for a single send/write. +**/ +@interface GCDAsyncUdpSendPacket : NSObject { +@public + NSData *buffer; + NSTimeInterval timeout; + long tag; + + BOOL resolveInProgress; + BOOL filterInProgress; + + NSArray *resolvedAddresses; + NSError *resolveError; + + NSData *address; + int addressFamily; +} + +- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i NS_DESIGNATED_INITIALIZER; + +@end + +@implementation GCDAsyncUdpSendPacket + +// Cover the superclass' designated initializer +- (instancetype)init NS_UNAVAILABLE +{ + NSAssert(0, @"Use the designated initializer"); + return nil; +} + +- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i +{ + if ((self = [super init])) + { + buffer = d; + timeout = t; + tag = i; + + resolveInProgress = NO; + } + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface GCDAsyncUdpSpecialPacket : NSObject { +@public +// uint8_t type; + + BOOL resolveInProgress; + + NSArray *addresses; + NSError *error; +} + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +@implementation GCDAsyncUdpSpecialPacket + +- (instancetype)init +{ + self = [super init]; + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation GCDAsyncUdpSocket + +- (instancetype)init +{ + LogTrace(); + + return [self initWithDelegate:nil delegateQueue:NULL socketQueue:NULL]; +} + +- (instancetype)initWithSocketQueue:(dispatch_queue_t)sq +{ + LogTrace(); + + return [self initWithDelegate:nil delegateQueue:NULL socketQueue:sq]; +} + +- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq +{ + LogTrace(); + + return [self initWithDelegate:aDelegate delegateQueue:dq socketQueue:NULL]; +} + +- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq +{ + LogTrace(); + + if ((self = [super init])) + { + delegate = aDelegate; + + if (dq) + { + delegateQueue = dq; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(delegateQueue); + #endif + } + + max4ReceiveSize = 65535; + max6ReceiveSize = 65535; + + maxSendSize = 65535; + + socket4FD = SOCKET_NULL; + socket6FD = SOCKET_NULL; + + if (sq) + { + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + + socketQueue = sq; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(socketQueue); + #endif + } + else + { + socketQueue = dispatch_queue_create([GCDAsyncUdpSocketQueueName UTF8String], NULL); + } + + // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. + // From the documentation: + // + // > Keys are only compared as pointers and are never dereferenced. + // > Thus, you can use a pointer to a static variable for a specific subsystem or + // > any other value that allows you to identify the value uniquely. + // + // We're just going to use the memory address of an ivar. + // Specifically an ivar that is explicitly named for our purpose to make the code more readable. + // + // However, it feels tedious (and less readable) to include the "&" all the time: + // dispatch_get_specific(&IsOnSocketQueueOrTargetQueueKey) + // + // So we're going to make it so it doesn't matter if we use the '&' or not, + // by assigning the value of the ivar to the address of the ivar. + // Thus: IsOnSocketQueueOrTargetQueueKey == &IsOnSocketQueueOrTargetQueueKey; + + IsOnSocketQueueOrTargetQueueKey = &IsOnSocketQueueOrTargetQueueKey; + + void *nonNullUnusedPointer = (__bridge void *)self; + dispatch_queue_set_specific(socketQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); + + currentSend = nil; + sendQueue = [[NSMutableArray alloc] initWithCapacity:5]; + + #if TARGET_OS_IPHONE + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationWillEnterForeground:) + name:UIApplicationWillEnterForegroundNotification + object:nil]; + #endif + } + return self; +} + +- (void)dealloc +{ + LogInfo(@"%@ - %@ (start)", THIS_METHOD, self); + +#if TARGET_OS_IPHONE + [[NSNotificationCenter defaultCenter] removeObserver:self]; +#endif + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + [self closeWithError:nil]; + } + else + { + dispatch_sync(socketQueue, ^{ + [self closeWithError:nil]; + }); + } + + delegate = nil; + #if !OS_OBJECT_USE_OBJC + if (delegateQueue) dispatch_release(delegateQueue); + #endif + delegateQueue = NULL; + + #if !OS_OBJECT_USE_OBJC + if (socketQueue) dispatch_release(socketQueue); + #endif + socketQueue = NULL; + + LogInfo(@"%@ - %@ (finish)", THIS_METHOD, self); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Configuration +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (id)delegate +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + return delegate; + } + else + { + __block id result = nil; + + dispatch_sync(socketQueue, ^{ + result = self->delegate; + }); + + return result; + } +} + +- (void)setDelegate:(id)newDelegate synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + self->delegate = newDelegate; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegate:(id)newDelegate +{ + [self setDelegate:newDelegate synchronously:NO]; +} + +- (void)synchronouslySetDelegate:(id)newDelegate +{ + [self setDelegate:newDelegate synchronously:YES]; +} + +- (dispatch_queue_t)delegateQueue +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + return delegateQueue; + } + else + { + __block dispatch_queue_t result = NULL; + + dispatch_sync(socketQueue, ^{ + result = self->delegateQueue; + }); + + return result; + } +} + +- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->delegateQueue) dispatch_release(self->delegateQueue); + if (newDelegateQueue) dispatch_retain(newDelegateQueue); + #endif + + self->delegateQueue = newDelegateQueue; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegateQueue:newDelegateQueue synchronously:NO]; +} + +- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegateQueue:newDelegateQueue synchronously:YES]; +} + +- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + if (delegatePtr) *delegatePtr = delegate; + if (delegateQueuePtr) *delegateQueuePtr = delegateQueue; + } + else + { + __block id dPtr = NULL; + __block dispatch_queue_t dqPtr = NULL; + + dispatch_sync(socketQueue, ^{ + dPtr = self->delegate; + dqPtr = self->delegateQueue; + }); + + if (delegatePtr) *delegatePtr = dPtr; + if (delegateQueuePtr) *delegateQueuePtr = dqPtr; + } +} + +- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + + self->delegate = newDelegate; + + #if !OS_OBJECT_USE_OBJC + if (self->delegateQueue) dispatch_release(self->delegateQueue); + if (newDelegateQueue) dispatch_retain(newDelegateQueue); + #endif + + self->delegateQueue = newDelegateQueue; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO]; +} + +- (void)synchronouslySetDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES]; +} + +- (BOOL)isIPv4Enabled +{ + // Note: YES means kIPv4Disabled is OFF + + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + result = ((self->config & kIPv4Disabled) == 0); + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setIPv4Enabled:(BOOL)flag +{ + // Note: YES means kIPv4Disabled is OFF + + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); + + if (flag) + self->config &= ~kIPv4Disabled; + else + self->config |= kIPv4Disabled; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (BOOL)isIPv6Enabled +{ + // Note: YES means kIPv6Disabled is OFF + + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + result = ((self->config & kIPv6Disabled) == 0); + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setIPv6Enabled:(BOOL)flag +{ + // Note: YES means kIPv6Disabled is OFF + + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); + + if (flag) + self->config &= ~kIPv6Disabled; + else + self->config |= kIPv6Disabled; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (BOOL)isIPv4Preferred +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & kPreferIPv4) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv6Preferred +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & kPreferIPv6) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPVersionNeutral +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & (kPreferIPv4 | kPreferIPv6)) == 0; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setPreferIPv4 +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config |= kPreferIPv4; + self->config &= ~kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setPreferIPv6 +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config &= ~kPreferIPv4; + self->config |= kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setIPVersionNeutral +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config &= ~kPreferIPv4; + self->config &= ~kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint16_t)maxReceiveIPv4BufferSize +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + result = self->max4ReceiveSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->max4ReceiveSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint32_t)maxReceiveIPv6BufferSize +{ + __block uint32_t result = 0; + + dispatch_block_t block = ^{ + + result = self->max6ReceiveSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->max6ReceiveSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setMaxSendBufferSize:(uint16_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->maxSendSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint16_t)maxSendBufferSize +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + result = self->maxSendSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (id)userData +{ + __block id result = nil; + + dispatch_block_t block = ^{ + + result = self->userData; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setUserData:(id)arbitraryUserData +{ + dispatch_block_t block = ^{ + + if (self->userData != arbitraryUserData) + { + self->userData = arbitraryUserData; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Delegate Helpers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)notifyDidConnectToAddress:(NSData *)anAddress +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didConnectToAddress:)]) + { + NSData *address = [anAddress copy]; // In case param is NSMutableData + + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didConnectToAddress:address]; + }}); + } +} + +- (void)notifyDidNotConnect:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotConnect:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didNotConnect:error]; + }}); + } +} + +- (void)notifyDidSendDataWithTag:(long)tag +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didSendDataWithTag:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didSendDataWithTag:tag]; + }}); + } +} + +- (void)notifyDidNotSendDataWithTag:(long)tag dueToError:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotSendDataWithTag:dueToError:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didNotSendDataWithTag:tag dueToError:error]; + }}); + } +} + +- (void)notifyDidReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)context +{ + LogTrace(); + + SEL selector = @selector(udpSocket:didReceiveData:fromAddress:withFilterContext:); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:selector]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didReceiveData:data fromAddress:address withFilterContext:context]; + }}); + } +} + +- (void)notifyDidCloseWithError:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocketDidClose:withError:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocketDidClose:self withError:error]; + }}); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Errors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (NSError *)badConfigError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketBadConfigError + userInfo:userInfo]; +} + +- (NSError *)badParamError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketBadParamError + userInfo:userInfo]; +} + +- (NSError *)gaiError:(int)gai_error +{ + NSString *errMsg = [NSString stringWithCString:gai_strerror(gai_error) encoding:NSASCIIStringEncoding]; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:gai_error userInfo:userInfo]; +} + +- (NSError *)errnoErrorWithReason:(NSString *)reason +{ + NSString *errMsg = [NSString stringWithUTF8String:strerror(errno)]; + NSDictionary *userInfo; + + if (reason) + userInfo = @{NSLocalizedDescriptionKey : errMsg, + NSLocalizedFailureReasonErrorKey : reason}; + else + userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; +} + +- (NSError *)errnoError +{ + return [self errnoErrorWithReason:nil]; +} + +/** + * Returns a standard send timeout error. +**/ +- (NSError *)sendTimeoutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketSendTimeoutError", + @"GCDAsyncUdpSocket", [NSBundle mainBundle], + @"Send operation timed out", nil); + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketSendTimeoutError + userInfo:userInfo]; +} + +- (NSError *)socketClosedError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketClosedError", + @"GCDAsyncUdpSocket", [NSBundle mainBundle], + @"Socket closed", nil); + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain code:GCDAsyncUdpSocketClosedError userInfo:userInfo]; +} + +- (NSError *)otherError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketOtherError + userInfo:userInfo]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Utilities +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)preOp:(NSError **)errPtr +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (delegate == nil) // Must have delegate set + { + if (errPtr) + { + NSString *msg = @"Attempting to use socket without a delegate. Set a delegate first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if (delegateQueue == NULL) // Must have delegate queue set + { + if (errPtr) + { + NSString *msg = @"Attempting to use socket without a delegate queue. Set a delegate queue first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +/** + * This method executes on a global concurrent queue. + * When complete, it executes the given completion block on the socketQueue. +**/ +- (void)asyncResolveHost:(NSString *)aHost + port:(uint16_t)port + withCompletionBlock:(void (^)(NSArray *addresses, NSError *error))completionBlock +{ + LogTrace(); + + // Check parameter(s) + + if (aHost == nil) + { + NSString *msg = @"The host param is nil. Should be domain name or IP address string."; + NSError *error = [self badParamError:msg]; + + // We should still use dispatch_async since this method is expected to be asynchronous + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + completionBlock(nil, error); + }}); + + return; + } + + // It's possible that the given aHost parameter is actually a NSMutableString. + // So we want to copy it now, within this block that will be executed synchronously. + // This way the asynchronous lookup block below doesn't have to worry about it changing. + + NSString *host = [aHost copy]; + + + dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(globalConcurrentQueue, ^{ @autoreleasepool { + + NSMutableArray *addresses = [NSMutableArray arrayWithCapacity:2]; + NSError *error = nil; + + if ([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) + { + // Use LOOPBACK address + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(struct sockaddr_in); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(struct sockaddr_in6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_loopback; + + // Wrap the native address structures and add to list + [addresses addObject:[NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]]; + [addresses addObject:[NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]]; + } + else + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + + int gai_error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); + + if (gai_error) + { + error = [self gaiError:gai_error]; + } + else + { + for(res = res0; res; res = res->ai_next) + { + if (res->ai_family == AF_INET) + { + // Found IPv4 address + // Wrap the native address structure and add to list + + [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; + } + else if (res->ai_family == AF_INET6) + { + + // Fixes connection issues with IPv6, it is the same solution for udp socket. + // https://github.com/robbiehanson/CocoaAsyncSocket/issues/429#issuecomment-222477158 + struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)(void *)res->ai_addr; + in_port_t *portPtr = &sockaddr->sin6_port; + if ((portPtr != NULL) && (*portPtr == 0)) { + *portPtr = htons(port); + } + + // Found IPv6 address + // Wrap the native address structure and add to list + [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; + } + } + freeaddrinfo(res0); + + if ([addresses count] == 0) + { + error = [self gaiError:EAI_FAIL]; + } + } + } + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + completionBlock(addresses, error); + }}); + + }}); +} + +/** + * This method picks an address from the given list of addresses. + * The address picked depends upon which protocols are disabled, deactived, & preferred. + * + * Returns the address family (AF_INET or AF_INET6) of the picked address, + * or AF_UNSPEC and the corresponding error is there's a problem. +**/ +- (int)getAddress:(NSData **)addressPtr error:(NSError **)errorPtr fromAddresses:(NSArray *)addresses +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert([addresses count] > 0, @"Expected at least one address"); + + int resultAF = AF_UNSPEC; + NSData *resultAddress = nil; + NSError *resultError = nil; + + // Check for problems + + BOOL resolvedIPv4Address = NO; + BOOL resolvedIPv6Address = NO; + + for (NSData *address in addresses) + { + switch ([[self class] familyFromAddress:address]) + { + case AF_INET : resolvedIPv4Address = YES; break; + case AF_INET6 : resolvedIPv6Address = YES; break; + + default : NSAssert(NO, @"Addresses array contains invalid address"); + } + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && !resolvedIPv6Address) + { + NSString *msg = @"IPv4 has been disabled and DNS lookup found no IPv6 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + if (isIPv6Disabled && !resolvedIPv4Address) + { + NSString *msg = @"IPv6 has been disabled and DNS lookup found no IPv4 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + BOOL isIPv4Deactivated = (flags & kIPv4Deactivated) ? YES : NO; + BOOL isIPv6Deactivated = (flags & kIPv6Deactivated) ? YES : NO; + + if (isIPv4Deactivated && !resolvedIPv6Address) + { + NSString *msg = @"IPv4 has been deactivated due to bind/connect, and DNS lookup found no IPv6 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + if (isIPv6Deactivated && !resolvedIPv4Address) + { + NSString *msg = @"IPv6 has been deactivated due to bind/connect, and DNS lookup found no IPv4 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + // Extract first IPv4 and IPv6 address in list + + BOOL ipv4WasFirstInList = YES; + NSData *address4 = nil; + NSData *address6 = nil; + + for (NSData *address in addresses) + { + int af = [[self class] familyFromAddress:address]; + + if (af == AF_INET) + { + if (address4 == nil) + { + address4 = address; + + if (address6) + break; + else + ipv4WasFirstInList = YES; + } + } + else // af == AF_INET6 + { + if (address6 == nil) + { + address6 = address; + + if (address4) + break; + else + ipv4WasFirstInList = NO; + } + } + } + + // Determine socket type + + BOOL preferIPv4 = (config & kPreferIPv4) ? YES : NO; + BOOL preferIPv6 = (config & kPreferIPv6) ? YES : NO; + + BOOL useIPv4 = ((preferIPv4 && address4) || (address6 == nil)); + BOOL useIPv6 = ((preferIPv6 && address6) || (address4 == nil)); + + NSAssert(!(preferIPv4 && preferIPv6), @"Invalid config state"); + NSAssert(!(useIPv4 && useIPv6), @"Invalid logic"); + + if (useIPv4 || (!useIPv6 && ipv4WasFirstInList)) + { + resultAF = AF_INET; + resultAddress = address4; + } + else + { + resultAF = AF_INET6; + resultAddress = address6; + } + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; +} + +/** + * Finds the address(es) of an interface description. + * An inteface description may be an interface name (en0, en1, lo0) or corresponding IP (192.168.4.34). +**/ +- (void)convertIntefaceDescription:(NSString *)interfaceDescription + port:(uint16_t)port + intoAddress4:(NSData **)interfaceAddr4Ptr + address6:(NSData **)interfaceAddr6Ptr +{ + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (interfaceDescription == nil) + { + // ANY address + + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(sockaddr4); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(sockaddr6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_any; + + addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; + } + else if ([interfaceDescription isEqualToString:@"localhost"] || + [interfaceDescription isEqualToString:@"loopback"]) + { + // LOOPBACK address + + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(struct sockaddr_in); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(struct sockaddr_in6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_loopback; + + addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; + } + else + { + const char *iface = [interfaceDescription UTF8String]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if ((addr4 == nil) && (cursor->ifa_addr->sa_family == AF_INET)) + { + // IPv4 + + struct sockaddr_in *addr = (struct sockaddr_in *)(void *)cursor->ifa_addr; + + if (strcmp(cursor->ifa_name, iface) == 0) + { + // Name match + + struct sockaddr_in nativeAddr4 = *addr; + nativeAddr4.sin_port = htons(port); + + addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + } + else + { + char ip[INET_ADDRSTRLEN]; + + const char *conversion; + conversion = inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)); + + if ((conversion != NULL) && (strcmp(ip, iface) == 0)) + { + // IP match + + struct sockaddr_in nativeAddr4 = *addr; + nativeAddr4.sin_port = htons(port); + + addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + } + } + } + else if ((addr6 == nil) && (cursor->ifa_addr->sa_family == AF_INET6)) + { + // IPv6 + + const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; + + if (strcmp(cursor->ifa_name, iface) == 0) + { + // Name match + + struct sockaddr_in6 nativeAddr6 = *addr; + nativeAddr6.sin6_port = htons(port); + + addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + else + { + char ip[INET6_ADDRSTRLEN]; + + const char *conversion; + conversion = inet_ntop(AF_INET6, &addr->sin6_addr, ip, sizeof(ip)); + + if ((conversion != NULL) && (strcmp(ip, iface) == 0)) + { + // IP match + + struct sockaddr_in6 nativeAddr6 = *addr; + nativeAddr6.sin6_port = htons(port); + + addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + } + + if (interfaceAddr4Ptr) *interfaceAddr4Ptr = addr4; + if (interfaceAddr6Ptr) *interfaceAddr6Ptr = addr6; +} + +/** + * Converts a numeric hostname into its corresponding address. + * The hostname is expected to be an IPv4 or IPv6 address represented as a human-readable string. (e.g. 192.168.4.34) +**/ +- (void)convertNumericHost:(NSString *)numericHost + port:(uint16_t)port + intoAddress4:(NSData **)addr4Ptr + address6:(NSData **)addr6Ptr +{ + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (numericHost) + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_NUMERICHOST; // No name resolution should be attempted + + if (getaddrinfo([numericHost UTF8String], [portStr UTF8String], &hints, &res0) == 0) + { + for (res = res0; res; res = res->ai_next) + { + if ((addr4 == nil) && (res->ai_family == AF_INET)) + { + // Found IPv4 address + // Wrap the native address structure + addr4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + else if ((addr6 == nil) && (res->ai_family == AF_INET6)) + { + // Found IPv6 address + // Wrap the native address structure + addr6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + } + freeaddrinfo(res0); + } + } + + if (addr4Ptr) *addr4Ptr = addr4; + if (addr6Ptr) *addr6Ptr = addr6; +} + +- (BOOL)isConnectedToAddress4:(NSData *)someAddr4 +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(flags & kDidConnect, @"Not connected"); + NSAssert(cachedConnectedAddress, @"Expected cached connected address"); + + if (cachedConnectedFamily != AF_INET) + { + return NO; + } + + const struct sockaddr_in *sSockaddr4 = (const struct sockaddr_in *)[someAddr4 bytes]; + const struct sockaddr_in *cSockaddr4 = (const struct sockaddr_in *)[cachedConnectedAddress bytes]; + + if (memcmp(&sSockaddr4->sin_addr, &cSockaddr4->sin_addr, sizeof(struct in_addr)) != 0) + { + return NO; + } + if (memcmp(&sSockaddr4->sin_port, &cSockaddr4->sin_port, sizeof(in_port_t)) != 0) + { + return NO; + } + + return YES; +} + +- (BOOL)isConnectedToAddress6:(NSData *)someAddr6 +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(flags & kDidConnect, @"Not connected"); + NSAssert(cachedConnectedAddress, @"Expected cached connected address"); + + if (cachedConnectedFamily != AF_INET6) + { + return NO; + } + + const struct sockaddr_in6 *sSockaddr6 = (const struct sockaddr_in6 *)[someAddr6 bytes]; + const struct sockaddr_in6 *cSockaddr6 = (const struct sockaddr_in6 *)[cachedConnectedAddress bytes]; + + if (memcmp(&sSockaddr6->sin6_addr, &cSockaddr6->sin6_addr, sizeof(struct in6_addr)) != 0) + { + return NO; + } + if (memcmp(&sSockaddr6->sin6_port, &cSockaddr6->sin6_port, sizeof(in_port_t)) != 0) + { + return NO; + } + + return YES; +} + +- (unsigned int)indexOfInterfaceAddr4:(NSData *)interfaceAddr4 +{ + if (interfaceAddr4 == nil) + return 0; + if ([interfaceAddr4 length] != sizeof(struct sockaddr_in)) + return 0; + + int result = 0; + const struct sockaddr_in *ifaceAddr = (const struct sockaddr_in *)[interfaceAddr4 bytes]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if (cursor->ifa_addr->sa_family == AF_INET) + { + // IPv4 + + const struct sockaddr_in *addr = (const struct sockaddr_in *)(const void *)cursor->ifa_addr; + + if (memcmp(&addr->sin_addr, &ifaceAddr->sin_addr, sizeof(struct in_addr)) == 0) + { + result = if_nametoindex(cursor->ifa_name); + break; + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + + return result; +} + +- (unsigned int)indexOfInterfaceAddr6:(NSData *)interfaceAddr6 +{ + if (interfaceAddr6 == nil) + return 0; + if ([interfaceAddr6 length] != sizeof(struct sockaddr_in6)) + return 0; + + int result = 0; + const struct sockaddr_in6 *ifaceAddr = (const struct sockaddr_in6 *)[interfaceAddr6 bytes]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if (cursor->ifa_addr->sa_family == AF_INET6) + { + // IPv6 + + const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; + + if (memcmp(&addr->sin6_addr, &ifaceAddr->sin6_addr, sizeof(struct in6_addr)) == 0) + { + result = if_nametoindex(cursor->ifa_name); + break; + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + + return result; +} + +- (void)setupSendAndReceiveSourcesForSocket4 +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + send4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket4FD, 0, socketQueue); + receive4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket4FD, 0, socketQueue); + + // Setup event handlers + + dispatch_source_set_event_handler(send4Source, ^{ @autoreleasepool { + + LogVerbose(@"send4EventBlock"); + LogVerbose(@"dispatch_source_get_data(send4Source) = %lu", dispatch_source_get_data(send4Source)); + + self->flags |= kSock4CanAcceptBytes; + + // If we're ready to send data, do so immediately. + // Otherwise pause the send source or it will continue to fire over and over again. + + if (self->currentSend == nil) + { + LogVerbose(@"Nothing to send"); + [self suspendSend4Source]; + } + else if (self->currentSend->resolveInProgress) + { + LogVerbose(@"currentSend - waiting for address resolve"); + [self suspendSend4Source]; + } + else if (self->currentSend->filterInProgress) + { + LogVerbose(@"currentSend - waiting on sendFilter"); + [self suspendSend4Source]; + } + else + { + [self doSend]; + } + + }}); + + dispatch_source_set_event_handler(receive4Source, ^{ @autoreleasepool { + + LogVerbose(@"receive4EventBlock"); + + self->socket4FDBytesAvailable = dispatch_source_get_data(self->receive4Source); + LogVerbose(@"socket4FDBytesAvailable: %lu", socket4FDBytesAvailable); + + if (self->socket4FDBytesAvailable > 0) + [self doReceive]; + else + [self doReceiveEOF]; + + }}); + + // Setup cancel handlers + + __block int socketFDRefCount = 2; + + int theSocketFD = socket4FD; + + #if !OS_OBJECT_USE_OBJC + dispatch_source_t theSendSource = send4Source; + dispatch_source_t theReceiveSource = receive4Source; + #endif + + dispatch_source_set_cancel_handler(send4Source, ^{ + + LogVerbose(@"send4CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(send4Source)"); + dispatch_release(theSendSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket4FD)"); + close(theSocketFD); + } + }); + + dispatch_source_set_cancel_handler(receive4Source, ^{ + + LogVerbose(@"receive4CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(receive4Source)"); + dispatch_release(theReceiveSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket4FD)"); + close(theSocketFD); + } + }); + + // We will not be able to receive until the socket is bound to a port, + // either explicitly via bind, or implicitly by connect or by sending data. + // + // But we should be able to send immediately. + + socket4FDBytesAvailable = 0; + flags |= kSock4CanAcceptBytes; + + flags |= kSend4SourceSuspended; + flags |= kReceive4SourceSuspended; +} + +- (void)setupSendAndReceiveSourcesForSocket6 +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + send6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket6FD, 0, socketQueue); + receive6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket6FD, 0, socketQueue); + + // Setup event handlers + + dispatch_source_set_event_handler(send6Source, ^{ @autoreleasepool { + + LogVerbose(@"send6EventBlock"); + LogVerbose(@"dispatch_source_get_data(send6Source) = %lu", dispatch_source_get_data(send6Source)); + + self->flags |= kSock6CanAcceptBytes; + + // If we're ready to send data, do so immediately. + // Otherwise pause the send source or it will continue to fire over and over again. + + if (self->currentSend == nil) + { + LogVerbose(@"Nothing to send"); + [self suspendSend6Source]; + } + else if (self->currentSend->resolveInProgress) + { + LogVerbose(@"currentSend - waiting for address resolve"); + [self suspendSend6Source]; + } + else if (self->currentSend->filterInProgress) + { + LogVerbose(@"currentSend - waiting on sendFilter"); + [self suspendSend6Source]; + } + else + { + [self doSend]; + } + + }}); + + dispatch_source_set_event_handler(receive6Source, ^{ @autoreleasepool { + + LogVerbose(@"receive6EventBlock"); + + self->socket6FDBytesAvailable = dispatch_source_get_data(self->receive6Source); + LogVerbose(@"socket6FDBytesAvailable: %lu", socket6FDBytesAvailable); + + if (self->socket6FDBytesAvailable > 0) + [self doReceive]; + else + [self doReceiveEOF]; + + }}); + + // Setup cancel handlers + + __block int socketFDRefCount = 2; + + int theSocketFD = socket6FD; + + #if !OS_OBJECT_USE_OBJC + dispatch_source_t theSendSource = send6Source; + dispatch_source_t theReceiveSource = receive6Source; + #endif + + dispatch_source_set_cancel_handler(send6Source, ^{ + + LogVerbose(@"send6CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(send6Source)"); + dispatch_release(theSendSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket6FD)"); + close(theSocketFD); + } + }); + + dispatch_source_set_cancel_handler(receive6Source, ^{ + + LogVerbose(@"receive6CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(receive6Source)"); + dispatch_release(theReceiveSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket6FD)"); + close(theSocketFD); + } + }); + + // We will not be able to receive until the socket is bound to a port, + // either explicitly via bind, or implicitly by connect or by sending data. + // + // But we should be able to send immediately. + + socket6FDBytesAvailable = 0; + flags |= kSock6CanAcceptBytes; + + flags |= kSend6SourceSuspended; + flags |= kReceive6SourceSuspended; +} + +- (BOOL)createSocket4:(BOOL)useIPv4 socket6:(BOOL)useIPv6 error:(NSError * __autoreleasing *)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(((flags & kDidCreateSockets) == 0), @"Sockets have already been created"); + + // CreateSocket Block + // This block will be invoked below. + + int(^createSocket)(int) = ^int (int domain) { + + int socketFD = socket(domain, SOCK_DGRAM, 0); + + if (socketFD == SOCKET_NULL) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in socket() function"]; + + return SOCKET_NULL; + } + + int status; + + // Set socket options + + status = fcntl(socketFD, F_SETFL, O_NONBLOCK); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error enabling non-blocking IO on socket (fcntl)"]; + + close(socketFD); + return SOCKET_NULL; + } + + int reuseaddr = 1; + status = setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error enabling address reuse (setsockopt)"]; + + close(socketFD); + return SOCKET_NULL; + } + + int nosigpipe = 1; + status = setsockopt(socketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error disabling sigpipe (setsockopt)"]; + + close(socketFD); + return SOCKET_NULL; + } + + /** + * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. + * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. + * + * The default maximum size of the UDP buffer in iOS is 9216 bytes. + * + * This is the reason of #222(GCD does not necessarily return the size of an entire UDP packet) and + * #535(GCDAsyncUDPSocket can not send data when data is greater than 9K) + * + * + * Enlarge the maximum size of UDP packet. + * I can not ensure the protocol type now so that the max size is set to 65535 :) + **/ + + status = setsockopt(socketFD, SOL_SOCKET, SO_SNDBUF, (const char*)&self->maxSendSize, sizeof(int)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error setting send buffer size (setsockopt)"]; + close(socketFD); + return SOCKET_NULL; + } + + status = setsockopt(socketFD, SOL_SOCKET, SO_RCVBUF, (const char*)&self->maxSendSize, sizeof(int)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error setting receive buffer size (setsockopt)"]; + close(socketFD); + return SOCKET_NULL; + } + + + return socketFD; + }; + + // Create sockets depending upon given configuration. + + if (useIPv4) + { + LogVerbose(@"Creating IPv4 socket"); + + socket4FD = createSocket(AF_INET); + if (socket4FD == SOCKET_NULL) + { + // errPtr set in local createSocket() block + return NO; + } + } + + if (useIPv6) + { + LogVerbose(@"Creating IPv6 socket"); + + socket6FD = createSocket(AF_INET6); + if (socket6FD == SOCKET_NULL) + { + // errPtr set in local createSocket() block + + if (socket4FD != SOCKET_NULL) + { + close(socket4FD); + socket4FD = SOCKET_NULL; + } + + return NO; + } + } + + // Setup send and receive sources + + if (useIPv4) + [self setupSendAndReceiveSourcesForSocket4]; + if (useIPv6) + [self setupSendAndReceiveSourcesForSocket6]; + + flags |= kDidCreateSockets; + return YES; +} + +- (BOOL)createSockets:(NSError **)errPtr +{ + LogTrace(); + + BOOL useIPv4 = [self isIPv4Enabled]; + BOOL useIPv6 = [self isIPv6Enabled]; + + return [self createSocket4:useIPv4 socket6:useIPv6 error:errPtr]; +} + +- (void)suspendSend4Source +{ + if (send4Source && !(flags & kSend4SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(send4Source)"); + + dispatch_suspend(send4Source); + flags |= kSend4SourceSuspended; + } +} + +- (void)suspendSend6Source +{ + if (send6Source && !(flags & kSend6SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(send6Source)"); + + dispatch_suspend(send6Source); + flags |= kSend6SourceSuspended; + } +} + +- (void)resumeSend4Source +{ + if (send4Source && (flags & kSend4SourceSuspended)) + { + LogVerbose(@"dispatch_resume(send4Source)"); + + dispatch_resume(send4Source); + flags &= ~kSend4SourceSuspended; + } +} + +- (void)resumeSend6Source +{ + if (send6Source && (flags & kSend6SourceSuspended)) + { + LogVerbose(@"dispatch_resume(send6Source)"); + + dispatch_resume(send6Source); + flags &= ~kSend6SourceSuspended; + } +} + +- (void)suspendReceive4Source +{ + if (receive4Source && !(flags & kReceive4SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(receive4Source)"); + + dispatch_suspend(receive4Source); + flags |= kReceive4SourceSuspended; + } +} + +- (void)suspendReceive6Source +{ + if (receive6Source && !(flags & kReceive6SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(receive6Source)"); + + dispatch_suspend(receive6Source); + flags |= kReceive6SourceSuspended; + } +} + +- (void)resumeReceive4Source +{ + if (receive4Source && (flags & kReceive4SourceSuspended)) + { + LogVerbose(@"dispatch_resume(receive4Source)"); + + dispatch_resume(receive4Source); + flags &= ~kReceive4SourceSuspended; + } +} + +- (void)resumeReceive6Source +{ + if (receive6Source && (flags & kReceive6SourceSuspended)) + { + LogVerbose(@"dispatch_resume(receive6Source)"); + + dispatch_resume(receive6Source); + flags &= ~kReceive6SourceSuspended; + } +} + +- (void)closeSocket4 +{ + if (socket4FD != SOCKET_NULL) + { + LogVerbose(@"dispatch_source_cancel(send4Source)"); + dispatch_source_cancel(send4Source); + + LogVerbose(@"dispatch_source_cancel(receive4Source)"); + dispatch_source_cancel(receive4Source); + + // For some crazy reason (in my opinion), cancelling a dispatch source doesn't + // invoke the cancel handler if the dispatch source is paused. + // So we have to unpause the source if needed. + // This allows the cancel handler to be run, which in turn releases the source and closes the socket. + + [self resumeSend4Source]; + [self resumeReceive4Source]; + + // The sockets will be closed by the cancel handlers of the corresponding source + + send4Source = NULL; + receive4Source = NULL; + + socket4FD = SOCKET_NULL; + + // Clear socket states + + socket4FDBytesAvailable = 0; + flags &= ~kSock4CanAcceptBytes; + + // Clear cached info + + cachedLocalAddress4 = nil; + cachedLocalHost4 = nil; + cachedLocalPort4 = 0; + } +} + +- (void)closeSocket6 +{ + if (socket6FD != SOCKET_NULL) + { + LogVerbose(@"dispatch_source_cancel(send6Source)"); + dispatch_source_cancel(send6Source); + + LogVerbose(@"dispatch_source_cancel(receive6Source)"); + dispatch_source_cancel(receive6Source); + + // For some crazy reason (in my opinion), cancelling a dispatch source doesn't + // invoke the cancel handler if the dispatch source is paused. + // So we have to unpause the source if needed. + // This allows the cancel handler to be run, which in turn releases the source and closes the socket. + + [self resumeSend6Source]; + [self resumeReceive6Source]; + + send6Source = NULL; + receive6Source = NULL; + + // The sockets will be closed by the cancel handlers of the corresponding source + + socket6FD = SOCKET_NULL; + + // Clear socket states + + socket6FDBytesAvailable = 0; + flags &= ~kSock6CanAcceptBytes; + + // Clear cached info + + cachedLocalAddress6 = nil; + cachedLocalHost6 = nil; + cachedLocalPort6 = 0; + } +} + +- (void)closeSockets +{ + [self closeSocket4]; + [self closeSocket6]; + + flags &= ~kDidCreateSockets; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Diagnostics +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)getLocalAddress:(NSData **)dataPtr + host:(NSString **)hostPtr + port:(uint16_t *)portPtr + forSocket:(int)socketFD + withFamily:(int)socketFamily +{ + + NSData *data = nil; + NSString *host = nil; + uint16_t port = 0; + + if (socketFamily == AF_INET) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getsockname(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) + { + data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + host = [[self class] hostFromSockaddr4:&sockaddr4]; + port = [[self class] portFromSockaddr4:&sockaddr4]; + } + else + { + LogWarn(@"Error in getsockname: %@", [self errnoError]); + } + } + else if (socketFamily == AF_INET6) + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getsockname(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) + { + data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + host = [[self class] hostFromSockaddr6:&sockaddr6]; + port = [[self class] portFromSockaddr6:&sockaddr6]; + } + else + { + LogWarn(@"Error in getsockname: %@", [self errnoError]); + } + } + + if (dataPtr) *dataPtr = data; + if (hostPtr) *hostPtr = host; + if (portPtr) *portPtr = port; + + return (data != nil); +} + +- (void)maybeUpdateCachedLocalAddress4Info +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if ( cachedLocalAddress4 || ((flags & kDidBind) == 0) || (socket4FD == SOCKET_NULL) ) + { + return; + } + + NSData *address = nil; + NSString *host = nil; + uint16_t port = 0; + + if ([self getLocalAddress:&address host:&host port:&port forSocket:socket4FD withFamily:AF_INET]) + { + + cachedLocalAddress4 = address; + cachedLocalHost4 = host; + cachedLocalPort4 = port; + } +} + +- (void)maybeUpdateCachedLocalAddress6Info +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if ( cachedLocalAddress6 || ((flags & kDidBind) == 0) || (socket6FD == SOCKET_NULL) ) + { + return; + } + + NSData *address = nil; + NSString *host = nil; + uint16_t port = 0; + + if ([self getLocalAddress:&address host:&host port:&port forSocket:socket6FD withFamily:AF_INET6]) + { + + cachedLocalAddress6 = address; + cachedLocalHost6 = host; + cachedLocalPort6 = port; + } +} + +- (NSData *)localAddress +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalAddress4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalAddress6; + } + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalHost4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalHost6; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalPort4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalPort6; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSData *)localAddress_IPv4 +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalAddress4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost_IPv4 +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalHost4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort_IPv4 +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalPort4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSData *)localAddress_IPv6 +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalAddress6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost_IPv6 +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalHost6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort_IPv6 +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalPort6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (void)maybeUpdateCachedConnectedAddressInfo +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (cachedConnectedAddress || (flags & kDidConnect) == 0) + { + return; + } + + NSData *data = nil; + NSString *host = nil; + uint16_t port = 0; + int family = AF_UNSPEC; + + if (socket4FD != SOCKET_NULL) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getpeername(socket4FD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) + { + data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + host = [[self class] hostFromSockaddr4:&sockaddr4]; + port = [[self class] portFromSockaddr4:&sockaddr4]; + family = AF_INET; + } + else + { + LogWarn(@"Error in getpeername: %@", [self errnoError]); + } + } + else if (socket6FD != SOCKET_NULL) + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getpeername(socket6FD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) + { + data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + host = [[self class] hostFromSockaddr6:&sockaddr6]; + port = [[self class] portFromSockaddr6:&sockaddr6]; + family = AF_INET6; + } + else + { + LogWarn(@"Error in getpeername: %@", [self errnoError]); + } + } + + + cachedConnectedAddress = data; + cachedConnectedHost = host; + cachedConnectedPort = port; + cachedConnectedFamily = family; +} + +- (NSData *)connectedAddress +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedAddress; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)connectedHost +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedHost; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)connectedPort +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedPort; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (BOOL)isConnected +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->flags & kDidConnect) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isClosed +{ + __block BOOL result = YES; + + dispatch_block_t block = ^{ + + result = (self->flags & kDidCreateSockets) ? NO : YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv4 +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + if (self->flags & kDidCreateSockets) + { + result = (self->socket4FD != SOCKET_NULL); + } + else + { + result = [self isIPv4Enabled]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv6 +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + if (self->flags & kDidCreateSockets) + { + result = (self->socket6FD != SOCKET_NULL); + } + else + { + result = [self isIPv6Enabled]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Binding +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This method runs through the various checks required prior to a bind attempt. + * It is shared between the various bind methods. +**/ +- (BOOL)preBind:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if (flags & kDidBind) + { + if (errPtr) + { + NSString *msg = @"Cannot bind a socket more than once."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot bind after connecting. If needed, bind first, then connect."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled + { + if (errPtr) + { + NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr +{ + return [self bindToPort:port interface:nil error:errPtr]; +} + +- (BOOL)bindToPort:(uint16_t)port interface:(NSString *)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preBind:&err]) + { + return_from_block; + } + + // Check the given interface + + NSData *interface4 = nil; + NSData *interface6 = nil; + + [self convertIntefaceDescription:interface port:port intoAddress4:&interface4 address6:&interface6]; + + if ((interface4 == nil) && (interface6 == nil)) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && (interface6 == nil)) + { + NSString *msg = @"IPv4 has been disabled and specified interface doesn't support IPv6."; + err = [self badParamError:msg]; + + return_from_block; + } + + if (isIPv6Disabled && (interface4 == nil)) + { + NSString *msg = @"IPv6 has been disabled and specified interface doesn't support IPv4."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Determine protocol(s) + + BOOL useIPv4 = !isIPv4Disabled && (interface4 != nil); + BOOL useIPv6 = !isIPv6Disabled && (interface6 != nil); + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) + { + return_from_block; + } + } + + // Bind the socket(s) + + LogVerbose(@"Binding socket to port(%hu) interface(%@)", port, interface); + + if (useIPv4) + { + int status = bind(self->socket4FD, (const struct sockaddr *)[interface4 bytes], (socklen_t)[interface4 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + if (useIPv6) + { + int status = bind(self->socket6FD, (const struct sockaddr *)[interface6 bytes], (socklen_t)[interface6 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + // Update flags + + self->flags |= kDidBind; + + if (!useIPv4) self->flags |= kIPv4Deactivated; + if (!useIPv6) self->flags |= kIPv6Deactivated; + + result = YES; + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error binding to port/interface: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preBind:&err]) + { + return_from_block; + } + + // Check the given address + + int addressFamily = [[self class] familyFromAddress:localAddr]; + + if (addressFamily == AF_UNSPEC) + { + NSString *msg = @"A valid IPv4 or IPv6 address was not given"; + err = [self badParamError:msg]; + + return_from_block; + } + + NSData *localAddr4 = (addressFamily == AF_INET) ? localAddr : nil; + NSData *localAddr6 = (addressFamily == AF_INET6) ? localAddr : nil; + + BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && localAddr4) + { + NSString *msg = @"IPv4 has been disabled and an IPv4 address was passed."; + err = [self badParamError:msg]; + + return_from_block; + } + + if (isIPv6Disabled && localAddr6) + { + NSString *msg = @"IPv6 has been disabled and an IPv6 address was passed."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Determine protocol(s) + + BOOL useIPv4 = !isIPv4Disabled && (localAddr4 != nil); + BOOL useIPv6 = !isIPv6Disabled && (localAddr6 != nil); + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) + { + return_from_block; + } + } + + // Bind the socket(s) + + if (useIPv4) + { + LogVerbose(@"Binding socket to address(%@:%hu)", + [[self class] hostFromAddress:localAddr4], + [[self class] portFromAddress:localAddr4]); + + int status = bind(self->socket4FD, (const struct sockaddr *)[localAddr4 bytes], (socklen_t)[localAddr4 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + else + { + LogVerbose(@"Binding socket to address(%@:%hu)", + [[self class] hostFromAddress:localAddr6], + [[self class] portFromAddress:localAddr6]); + + int status = bind(self->socket6FD, (const struct sockaddr *)[localAddr6 bytes], (socklen_t)[localAddr6 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + // Update flags + + self->flags |= kDidBind; + + if (!useIPv4) self->flags |= kIPv4Deactivated; + if (!useIPv6) self->flags |= kIPv6Deactivated; + + result = YES; + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error binding to address: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Connecting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This method runs through the various checks required prior to a connect attempt. + * It is shared between the various connect methods. +**/ +- (BOOL)preConnect:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot connect a socket more than once."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled + { + if (errPtr) + { + NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks. + + if (![self preConnect:&err]) + { + return_from_block; + } + + // Check parameter(s) + + if (host == nil) + { + NSString *msg = @"The host param is nil. Should be domain name or IP address string."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Create special connect packet + + GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; + packet->resolveInProgress = YES; + + // Start asynchronous DNS resolve for host:port on background queue + + LogVerbose(@"Dispatching DNS resolve for connect..."); + + [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { + + // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, + // and immediately returns. Once the async resolve task completes, + // this block is executed on our socketQueue. + + packet->resolveInProgress = NO; + + packet->addresses = addresses; + packet->error = error; + + [self maybeConnect]; + }]; + + // Updates flags, add connect packet to send queue, and pump send queue + + self->flags |= kConnecting; + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + result = YES; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error connecting to host/port: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks. + + if (![self preConnect:&err]) + { + return_from_block; + } + + // Check parameter(s) + + if (remoteAddr == nil) + { + NSString *msg = @"The address param is nil. Should be a valid address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // The remoteAddr parameter could be of type NSMutableData. + // So we copy it to be safe. + + NSData *address = [remoteAddr copy]; + NSArray *addresses = [NSArray arrayWithObject:address]; + + GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; + packet->addresses = addresses; + + // Updates flags, add connect packet to send queue, and pump send queue + + self->flags |= kConnecting; + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + result = YES; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error connecting to address: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (void)maybeConnect +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + + BOOL sendQueueReady = [currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]; + + if (sendQueueReady) + { + GCDAsyncUdpSpecialPacket *connectPacket = (GCDAsyncUdpSpecialPacket *)currentSend; + + if (connectPacket->resolveInProgress) + { + LogVerbose(@"Waiting for DNS resolve..."); + } + else + { + if (connectPacket->error) + { + [self notifyDidNotConnect:connectPacket->error]; + } + else + { + NSData *address = nil; + NSError *error = nil; + + int addressFamily = [self getAddress:&address error:&error fromAddresses:connectPacket->addresses]; + + // Perform connect + + BOOL result = NO; + + switch (addressFamily) + { + case AF_INET : result = [self connectWithAddress4:address error:&error]; break; + case AF_INET6 : result = [self connectWithAddress6:address error:&error]; break; + } + + if (result) + { + flags |= kDidBind; + flags |= kDidConnect; + + cachedConnectedAddress = address; + cachedConnectedHost = [[self class] hostFromAddress:address]; + cachedConnectedPort = [[self class] portFromAddress:address]; + cachedConnectedFamily = addressFamily; + + [self notifyDidConnectToAddress:address]; + } + else + { + [self notifyDidNotConnect:error]; + } + } + + flags &= ~kConnecting; + + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } +} + +- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + int status = connect(socket4FD, (const struct sockaddr *)[address4 bytes], (socklen_t)[address4 length]); + if (status != 0) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; + + return NO; + } + + [self closeSocket6]; + flags |= kIPv6Deactivated; + + return YES; +} + +- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + int status = connect(socket6FD, (const struct sockaddr *)[address6 bytes], (socklen_t)[address6 length]); + if (status != 0) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; + + return NO; + } + + [self closeSocket4]; + flags |= kIPv4Deactivated; + + return YES; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Multicast +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)preJoin:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if (!(flags & kDidBind)) + { + if (errPtr) + { + NSString *msg = @"Must bind a socket before joining a multicast group."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot join a multicast group if connected."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr +{ + return [self joinMulticastGroup:group onInterface:nil error:errPtr]; +} + +- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr +{ + // IP_ADD_MEMBERSHIP == IPV6_JOIN_GROUP + return [self performMulticastRequest:IP_ADD_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; +} + +- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr +{ + return [self leaveMulticastGroup:group onInterface:nil error:errPtr]; +} + +- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr +{ + // IP_DROP_MEMBERSHIP == IPV6_LEAVE_GROUP + return [self performMulticastRequest:IP_DROP_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; +} + +- (BOOL)performMulticastRequest:(int)requestType + forGroup:(NSString *)group + onInterface:(NSString *)interface + error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preJoin:&err]) + { + return_from_block; + } + + // Convert group to address + + NSData *groupAddr4 = nil; + NSData *groupAddr6 = nil; + + [self convertNumericHost:group port:0 intoAddress4:&groupAddr4 address6:&groupAddr6]; + + if ((groupAddr4 == nil) && (groupAddr6 == nil)) + { + NSString *msg = @"Unknown group. Specify valid group IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if ((interfaceAddr4 == nil) && (interfaceAddr6 == nil)) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Perform join + + if ((self->socket4FD != SOCKET_NULL) && groupAddr4 && interfaceAddr4) + { + const struct sockaddr_in *nativeGroup = (const struct sockaddr_in *)[groupAddr4 bytes]; + const struct sockaddr_in *nativeIface = (const struct sockaddr_in *)[interfaceAddr4 bytes]; + + struct ip_mreq imreq; + imreq.imr_multiaddr = nativeGroup->sin_addr; + imreq.imr_interface = nativeIface->sin_addr; + + int status = setsockopt(self->socket4FD, IPPROTO_IP, requestType, (const void *)&imreq, sizeof(imreq)); + if (status != 0) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + + // Using IPv4 only + [self closeSocket6]; + + result = YES; + } + else if ((self->socket6FD != SOCKET_NULL) && groupAddr6 && interfaceAddr6) + { + const struct sockaddr_in6 *nativeGroup = (const struct sockaddr_in6 *)[groupAddr6 bytes]; + + struct ipv6_mreq imreq; + imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr; + imreq.ipv6mr_interface = [self indexOfInterfaceAddr6:interfaceAddr6]; + + int status = setsockopt(self->socket6FD, IPPROTO_IPV6, requestType, (const void *)&imreq, sizeof(imreq)); + if (status != 0) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + + // Using IPv6 only + [self closeSocket4]; + + result = YES; + } + else + { + NSString *msg = @"Socket, group, and interface do not have matching IP versions"; + err = [self badParamError:msg]; + + return_from_block; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if (interfaceAddr4 == nil) + { + NSString *msg = @"Unknown interface. Specify valid interface by IP address."; + err = [self badParamError:msg]; + return_from_block; + } + + if (self->socket4FD != SOCKET_NULL) { + const struct sockaddr_in *nativeIface = (struct sockaddr_in *)[interfaceAddr4 bytes]; + struct in_addr interface_addr = nativeIface->sin_addr; + int status = setsockopt(self->socket4FD, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)); + if (status != 0) { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if (interfaceAddr6 == nil) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\")."; + err = [self badParamError:msg]; + return_from_block; + } + + if ((self->socket6FD != SOCKET_NULL)) { + uint32_t scope_id = [self indexOfInterfaceAddr6:interfaceAddr6]; + int status = setsockopt(self->socket6FD, IPPROTO_IPV6, IPV6_MULTICAST_IF, &scope_id, sizeof(scope_id)); + if (status != 0) { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Reuse port +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + int value = flag ? 1 : 0; + if (self->socket4FD != SOCKET_NULL) + { + int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + if (self->socket6FD != SOCKET_NULL) + { + int error = setsockopt(self->socket6FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Broadcast +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + if (self->socket4FD != SOCKET_NULL) + { + int value = flag ? 1 : 0; + int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_BROADCAST, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + // IPv6 does not implement broadcast, the ability to send a packet to all hosts on the attached link. + // The same effect can be achieved by sending a packet to the link-local all hosts multicast group. + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Sending +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)sendData:(NSData *)data withTag:(long)tag +{ + [self sendData:data withTimeout:-1.0 tag:tag]; +} + +- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + }}); + +} + +- (void)sendData:(NSData *)data + toHost:(NSString *)host + port:(uint16_t)port + withTimeout:(NSTimeInterval)timeout + tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + packet->resolveInProgress = YES; + + [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { + + // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, + // and immediately returns. Once the async resolve task completes, + // this block is executed on our socketQueue. + + packet->resolveInProgress = NO; + + packet->resolvedAddresses = addresses; + packet->resolveError = error; + + if (packet == self->currentSend) + { + LogVerbose(@"currentSend - address resolved"); + [self doPreSend]; + } + }]; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + }}); + +} + +- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + packet->addressFamily = [GCDAsyncUdpSocket familyFromAddress:remoteAddr]; + packet->address = remoteAddr; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + }}); +} + +- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue +{ + [self setSendFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; +} + +- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock + withQueue:(dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous +{ + GCDAsyncUdpSocketSendFilterBlock newFilterBlock = NULL; + dispatch_queue_t newFilterQueue = NULL; + + if (filterBlock) + { + NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); + + newFilterBlock = [filterBlock copy]; + newFilterQueue = filterQueue; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(newFilterQueue); + #endif + } + + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->sendFilterQueue) dispatch_release(self->sendFilterQueue); + #endif + + self->sendFilterBlock = newFilterBlock; + self->sendFilterQueue = newFilterQueue; + self->sendFilterAsync = isAsynchronous; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)maybeDequeueSend +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + // If we don't have a send operation already in progress + if (currentSend == nil) + { + // Create the sockets if needed + if ((flags & kDidCreateSockets) == 0) + { + NSError *err = nil; + if (![self createSockets:&err]) + { + [self closeWithError:err]; + return; + } + } + + while ([sendQueue count] > 0) + { + // Dequeue the next object in the queue + currentSend = [sendQueue objectAtIndex:0]; + [sendQueue removeObjectAtIndex:0]; + + if ([currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]) + { + [self maybeConnect]; + + return; // The maybeConnect method, if it connects, will invoke this method again + } + else if (currentSend->resolveError) + { + // Notify delegate + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:currentSend->resolveError]; + + // Clear currentSend + currentSend = nil; + + continue; + } + else + { + // Start preprocessing checks on the send packet + [self doPreSend]; + + break; + } + } + + if ((currentSend == nil) && (flags & kCloseAfterSends)) + { + [self closeWithError:nil]; + } + } +} + +/** + * This method is called after a sendPacket has been dequeued. + * It performs various preprocessing checks on the packet, + * and queries the sendFilter (if set) to determine if the packet can be sent. + * + * If the packet passes all checks, it will be passed on to the doSend method. +**/ +- (void)doPreSend +{ + LogTrace(); + + // + // 1. Check for problems with send packet + // + + BOOL waitingForResolve = NO; + NSError *error = nil; + + if (flags & kDidConnect) + { + // Connected socket + + if (currentSend->resolveInProgress || currentSend->resolvedAddresses || currentSend->resolveError) + { + NSString *msg = @"Cannot specify destination of packet for connected socket"; + error = [self badConfigError:msg]; + } + else + { + currentSend->address = cachedConnectedAddress; + currentSend->addressFamily = cachedConnectedFamily; + } + } + else + { + // Non-Connected socket + + if (currentSend->resolveInProgress) + { + // We're waiting for the packet's destination to be resolved. + waitingForResolve = YES; + } + else if (currentSend->resolveError) + { + error = currentSend->resolveError; + } + else if (currentSend->address == nil) + { + if (currentSend->resolvedAddresses == nil) + { + NSString *msg = @"You must specify destination of packet for a non-connected socket"; + error = [self badConfigError:msg]; + } + else + { + // Pick the proper address to use (out of possibly several resolved addresses) + + NSData *address = nil; + int addressFamily = AF_UNSPEC; + + addressFamily = [self getAddress:&address error:&error fromAddresses:currentSend->resolvedAddresses]; + + currentSend->address = address; + currentSend->addressFamily = addressFamily; + } + } + } + + if (waitingForResolve) + { + // We're waiting for the packet's destination to be resolved. + + LogVerbose(@"currentSend - waiting for address resolve"); + + if (flags & kSock4CanAcceptBytes) { + [self suspendSend4Source]; + } + if (flags & kSock6CanAcceptBytes) { + [self suspendSend6Source]; + } + + return; + } + + if (error) + { + // Unable to send packet due to some error. + // Notify delegate and move on. + + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:error]; + [self endCurrentSend]; + [self maybeDequeueSend]; + + return; + } + + // + // 2. Query sendFilter (if applicable) + // + + if (sendFilterBlock && sendFilterQueue) + { + // Query sendFilter + + if (sendFilterAsync) + { + // Scenario 1 of 3 - Need to asynchronously query sendFilter + + currentSend->filterInProgress = YES; + GCDAsyncUdpSendPacket *sendPacket = currentSend; + + dispatch_async(sendFilterQueue, ^{ @autoreleasepool { + + BOOL allowed = self->sendFilterBlock(sendPacket->buffer, sendPacket->address, sendPacket->tag); + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + sendPacket->filterInProgress = NO; + if (sendPacket == self->currentSend) + { + if (allowed) + { + [self doSend]; + } + else + { + LogVerbose(@"currentSend - silently dropped by sendFilter"); + + [self notifyDidSendDataWithTag:self->currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } + }}); + }}); + } + else + { + // Scenario 2 of 3 - Need to synchronously query sendFilter + + __block BOOL allowed = YES; + + dispatch_sync(sendFilterQueue, ^{ @autoreleasepool { + + allowed = self->sendFilterBlock(self->currentSend->buffer, self->currentSend->address, self->currentSend->tag); + }}); + + if (allowed) + { + [self doSend]; + } + else + { + LogVerbose(@"currentSend - silently dropped by sendFilter"); + + [self notifyDidSendDataWithTag:currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } + } + else // if (!sendFilterBlock || !sendFilterQueue) + { + // Scenario 3 of 3 - No sendFilter. Just go straight into sending. + + [self doSend]; + } +} + +/** + * This method performs the actual sending of data in the currentSend packet. + * It should only be called if the +**/ +- (void)doSend +{ + LogTrace(); + + NSAssert(currentSend != nil, @"Invalid logic"); + + // Perform the actual send + + ssize_t result = 0; + + if (flags & kDidConnect) + { + // Connected socket + + const void *buffer = [currentSend->buffer bytes]; + size_t length = (size_t)[currentSend->buffer length]; + + if (currentSend->addressFamily == AF_INET) + { + result = send(socket4FD, buffer, length, 0); + LogVerbose(@"send(socket4FD) = %d", result); + } + else + { + result = send(socket6FD, buffer, length, 0); + LogVerbose(@"send(socket6FD) = %d", result); + } + } + else + { + // Non-Connected socket + + const void *buffer = [currentSend->buffer bytes]; + size_t length = (size_t)[currentSend->buffer length]; + + const void *dst = [currentSend->address bytes]; + socklen_t dstSize = (socklen_t)[currentSend->address length]; + + if (currentSend->addressFamily == AF_INET) + { + result = sendto(socket4FD, buffer, length, 0, dst, dstSize); + LogVerbose(@"sendto(socket4FD) = %d", result); + } + else + { + result = sendto(socket6FD, buffer, length, 0, dst, dstSize); + LogVerbose(@"sendto(socket6FD) = %d", result); + } + } + + // If the socket wasn't bound before, it is now + + if ((flags & kDidBind) == 0) + { + flags |= kDidBind; + } + + // Check the results. + // + // From the send() & sendto() manpage: + // + // Upon successful completion, the number of bytes which were sent is returned. + // Otherwise, -1 is returned and the global variable errno is set to indicate the error. + + BOOL waitingForSocket = NO; + NSError *socketError = nil; + + if (result == 0) + { + waitingForSocket = YES; + } + else if (result < 0) + { + if (errno == EAGAIN) + waitingForSocket = YES; + else + socketError = [self errnoErrorWithReason:@"Error in send() function."]; + } + + if (waitingForSocket) + { + // Not enough room in the underlying OS socket send buffer. + // Wait for a notification of available space. + + LogVerbose(@"currentSend - waiting for socket"); + + if (!(flags & kSock4CanAcceptBytes)) { + [self resumeSend4Source]; + } + if (!(flags & kSock6CanAcceptBytes)) { + [self resumeSend6Source]; + } + + if ((sendTimer == NULL) && (currentSend->timeout >= 0.0)) + { + // Unable to send packet right away. + // Start timer to timeout the send operation. + + [self setupSendTimerWithTimeout:currentSend->timeout]; + } + } + else if (socketError) + { + [self closeWithError:socketError]; + } + else // done + { + [self notifyDidSendDataWithTag:currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } +} + +/** + * Releases all resources associated with the currentSend. +**/ +- (void)endCurrentSend +{ + if (sendTimer) + { + dispatch_source_cancel(sendTimer); + #if !OS_OBJECT_USE_OBJC + dispatch_release(sendTimer); + #endif + sendTimer = NULL; + } + + currentSend = nil; +} + +/** + * Performs the operations to timeout the current send operation, and move on. +**/ +- (void)doSendTimeout +{ + LogTrace(); + + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:[self sendTimeoutError]]; + [self endCurrentSend]; + [self maybeDequeueSend]; +} + +/** + * Sets up a timer that fires to timeout the current send operation. + * This method should only be called once per send packet. +**/ +- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout +{ + NSAssert(sendTimer == NULL, @"Invalid logic"); + NSAssert(timeout >= 0.0, @"Invalid logic"); + + LogTrace(); + + sendTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); + + dispatch_source_set_event_handler(sendTimer, ^{ @autoreleasepool { + + [self doSendTimeout]; + }}); + + dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); + + dispatch_source_set_timer(sendTimer, tt, DISPATCH_TIME_FOREVER, 0); + dispatch_resume(sendTimer); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Receiving +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)receiveOnce:(NSError **)errPtr +{ + LogTrace(); + + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ + + if ((self->flags & kReceiveOnce) == 0) + { + if ((self->flags & kDidCreateSockets) == 0) + { + NSString *msg = @"Must bind socket before you can receive data. " + @"You can do this explicitly via bind, or implicitly via connect or by sending data."; + + err = [self badConfigError:msg]; + return_from_block; + } + + self->flags |= kReceiveOnce; // Enable + self->flags &= ~kReceiveContinuous; // Disable + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + [self doReceive]; + }}); + } + + result = YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error in beginReceiving: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)beginReceiving:(NSError **)errPtr +{ + LogTrace(); + + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ + + if ((self->flags & kReceiveContinuous) == 0) + { + if ((self->flags & kDidCreateSockets) == 0) + { + NSString *msg = @"Must bind socket before you can receive data. " + @"You can do this explicitly via bind, or implicitly via connect or by sending data."; + + err = [self badConfigError:msg]; + return_from_block; + } + + self->flags |= kReceiveContinuous; // Enable + self->flags &= ~kReceiveOnce; // Disable + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + [self doReceive]; + }}); + } + + result = YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error in beginReceiving: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (void)pauseReceiving +{ + LogTrace(); + + dispatch_block_t block = ^{ + + self->flags &= ~kReceiveOnce; // Disable + self->flags &= ~kReceiveContinuous; // Disable + + if (self->socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (self->socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue +{ + [self setReceiveFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; +} + +- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock + withQueue:(dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous +{ + GCDAsyncUdpSocketReceiveFilterBlock newFilterBlock = NULL; + dispatch_queue_t newFilterQueue = NULL; + + if (filterBlock) + { + NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); + + newFilterBlock = [filterBlock copy]; + newFilterQueue = filterQueue; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(newFilterQueue); + #endif + } + + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->receiveFilterQueue) dispatch_release(self->receiveFilterQueue); + #endif + + self->receiveFilterBlock = newFilterBlock; + self->receiveFilterQueue = newFilterQueue; + self->receiveFilterAsync = isAsynchronous; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)doReceive +{ + LogTrace(); + + if ((flags & (kReceiveOnce | kReceiveContinuous)) == 0) + { + LogVerbose(@"Receiving is paused..."); + + if (socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + + return; + } + + if ((flags & kReceiveOnce) && (pendingFilterOperations > 0)) + { + LogVerbose(@"Receiving is temporarily paused (pending filter operations)..."); + + if (socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + + return; + } + + if ((socket4FDBytesAvailable == 0) && (socket6FDBytesAvailable == 0)) + { + LogVerbose(@"No data available to receive..."); + + if (socket4FDBytesAvailable == 0) { + [self resumeReceive4Source]; + } + if (socket6FDBytesAvailable == 0) { + [self resumeReceive6Source]; + } + + return; + } + + // Figure out if we should receive on socket4 or socket6 + + BOOL doReceive4; + + if (flags & kDidConnect) + { + // Connected socket + + doReceive4 = (socket4FD != SOCKET_NULL); + } + else + { + // Non-Connected socket + + if (socket4FDBytesAvailable > 0) + { + if (socket6FDBytesAvailable > 0) + { + // Bytes available on socket4 & socket6 + + doReceive4 = (flags & kFlipFlop) ? YES : NO; + + flags ^= kFlipFlop; // flags = flags xor kFlipFlop; (toggle flip flop bit) + } + else { + // Bytes available on socket4, but not socket6 + doReceive4 = YES; + } + } + else { + // Bytes available on socket6, but not socket4 + doReceive4 = NO; + } + } + + // Perform socket IO + + ssize_t result = 0; + + NSData *data = nil; + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (doReceive4) + { + NSAssert(socket4FDBytesAvailable > 0, @"Invalid logic"); + LogVerbose(@"Receiving on IPv4"); + + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + // #222: GCD does not necessarily return the size of an entire UDP packet + // from dispatch_source_get_data(), so we must use the maximum packet size. + size_t bufSize = max4ReceiveSize; + void *buf = malloc(bufSize); + + result = recvfrom(socket4FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr4, &sockaddr4len); + LogVerbose(@"recvfrom(socket4FD) = %i", (int)result); + + if (result > 0) + { + if ((size_t)result >= socket4FDBytesAvailable) + socket4FDBytesAvailable = 0; + else + socket4FDBytesAvailable -= result; + + if ((size_t)result != bufSize) { + buf = realloc(buf, result); + } + + data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; + addr4 = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + } + else + { + LogVerbose(@"recvfrom(socket4FD) = %@", [self errnoError]); + socket4FDBytesAvailable = 0; + free(buf); + } + } + else + { + NSAssert(socket6FDBytesAvailable > 0, @"Invalid logic"); + LogVerbose(@"Receiving on IPv6"); + + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + // #222: GCD does not necessarily return the size of an entire UDP packet + // from dispatch_source_get_data(), so we must use the maximum packet size. + size_t bufSize = max6ReceiveSize; + void *buf = malloc(bufSize); + + result = recvfrom(socket6FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr6, &sockaddr6len); + LogVerbose(@"recvfrom(socket6FD) -> %i", (int)result); + + if (result > 0) + { + if ((size_t)result >= socket6FDBytesAvailable) + socket6FDBytesAvailable = 0; + else + socket6FDBytesAvailable -= result; + + if ((size_t)result != bufSize) { + buf = realloc(buf, result); + } + + data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + } + else + { + LogVerbose(@"recvfrom(socket6FD) = %@", [self errnoError]); + socket6FDBytesAvailable = 0; + free(buf); + } + } + + + BOOL waitingForSocket = NO; + BOOL notifiedDelegate = NO; + BOOL ignored = NO; + + NSError *socketError = nil; + + if (result == 0) + { + waitingForSocket = YES; + } + else if (result < 0) + { + if (errno == EAGAIN) + waitingForSocket = YES; + else + socketError = [self errnoErrorWithReason:@"Error in recvfrom() function"]; + } + else + { + if (flags & kDidConnect) + { + if (addr4 && ![self isConnectedToAddress4:addr4]) + ignored = YES; + if (addr6 && ![self isConnectedToAddress6:addr6]) + ignored = YES; + } + + NSData *addr = (addr4 != nil) ? addr4 : addr6; + + if (!ignored) + { + if (receiveFilterBlock && receiveFilterQueue) + { + // Run data through filter, and if approved, notify delegate + + __block id filterContext = nil; + __block BOOL allowed = NO; + + if (receiveFilterAsync) + { + pendingFilterOperations++; + dispatch_async(receiveFilterQueue, ^{ @autoreleasepool { + + allowed = self->receiveFilterBlock(data, addr, &filterContext); + + // Transition back to socketQueue to get the current delegate / delegateQueue + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + self->pendingFilterOperations--; + + if (allowed) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; + } + else + { + LogVerbose(@"received packet silently dropped by receiveFilter"); + } + + if (self->flags & kReceiveOnce) + { + if (allowed) + { + // The delegate has been notified, + // so our receive once operation has completed. + self->flags &= ~kReceiveOnce; + } + else if (self->pendingFilterOperations == 0) + { + // All pending filter operations have completed, + // and none were allowed through. + // Our receive once operation hasn't completed yet. + [self doReceive]; + } + } + }}); + }}); + } + else // if (!receiveFilterAsync) + { + dispatch_sync(receiveFilterQueue, ^{ @autoreleasepool { + + allowed = self->receiveFilterBlock(data, addr, &filterContext); + }}); + + if (allowed) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; + notifiedDelegate = YES; + } + else + { + LogVerbose(@"received packet silently dropped by receiveFilter"); + ignored = YES; + } + } + } + else // if (!receiveFilterBlock || !receiveFilterQueue) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:nil]; + notifiedDelegate = YES; + } + } + } + + if (waitingForSocket) + { + // Wait for a notification of available data. + + if (socket4FDBytesAvailable == 0) { + [self resumeReceive4Source]; + } + if (socket6FDBytesAvailable == 0) { + [self resumeReceive6Source]; + } + } + else if (socketError) + { + [self closeWithError:socketError]; + } + else + { + if (flags & kReceiveContinuous) + { + // Continuous receive mode + [self doReceive]; + } + else + { + // One-at-a-time receive mode + if (notifiedDelegate) + { + // The delegate has been notified (no set filter). + // So our receive once operation has completed. + flags &= ~kReceiveOnce; + } + else if (ignored) + { + [self doReceive]; + } + else + { + // Waiting on asynchronous receive filter... + } + } + } +} + +- (void)doReceiveEOF +{ + LogTrace(); + + [self closeWithError:[self socketClosedError]]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Closing +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)closeWithError:(NSError *)error +{ + LogVerbose(@"closeWithError: %@", error); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (currentSend) [self endCurrentSend]; + + [sendQueue removeAllObjects]; + + // If a socket has been created, we should notify the delegate. + BOOL shouldCallDelegate = (flags & kDidCreateSockets) ? YES : NO; + + // Close all sockets, send/receive sources, cfstreams, etc +#if TARGET_OS_IPHONE + [self removeStreamsFromRunLoop]; + [self closeReadAndWriteStreams]; +#endif + [self closeSockets]; + + // Clear all flags (config remains as is) + flags = 0; + + if (shouldCallDelegate) + { + [self notifyDidCloseWithError:error]; + } +} + +- (void)close +{ + LogTrace(); + + dispatch_block_t block = ^{ @autoreleasepool { + + [self closeWithError:nil]; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); +} + +- (void)closeAfterSending +{ + LogTrace(); + + dispatch_block_t block = ^{ @autoreleasepool { + + self->flags |= kCloseAfterSends; + + if (self->currentSend == nil && [self->sendQueue count] == 0) + { + [self closeWithError:nil]; + } + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark CFStream +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#if TARGET_OS_IPHONE + +static NSThread *listenerThread; + ++ (void)ignore:(id)_ +{} + ++ (void)startListenerThreadIfNeeded +{ + static dispatch_once_t predicate; + dispatch_once(&predicate, ^{ + + listenerThread = [[NSThread alloc] initWithTarget:self + selector:@selector(listenerThread:) + object:nil]; + [listenerThread start]; + }); +} + ++ (void)listenerThread:(id)unused +{ + @autoreleasepool { + + [[NSThread currentThread] setName:GCDAsyncUdpSocketThreadName]; + + LogInfo(@"ListenerThread: Started"); + + // We can't run the run loop unless it has an associated input source or a timer. + // So we'll just create a timer that will never fire - unless the server runs for a decades. + [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow] + target:self + selector:@selector(ignore:) + userInfo:nil + repeats:YES]; + + [[NSRunLoop currentRunLoop] run]; + + LogInfo(@"ListenerThread: Stopped"); + } +} + ++ (void)addStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket +{ + LogTrace(); + NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); + + CFRunLoopRef runLoop = CFRunLoopGetCurrent(); + + if (asyncUdpSocket->readStream4) + CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->readStream6) + CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream4) + CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream6) + CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); +} + ++ (void)removeStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket +{ + LogTrace(); + NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); + + CFRunLoopRef runLoop = CFRunLoopGetCurrent(); + + if (asyncUdpSocket->readStream4) + CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->readStream6) + CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream4) + CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream6) + CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); +} + +static void CFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; + + switch(type) + { + case kCFStreamEventOpenCompleted: + { + LogCVerbose(@"CFReadStreamCallback - Open"); + break; + } + case kCFStreamEventHasBytesAvailable: + { + LogCVerbose(@"CFReadStreamCallback - HasBytesAvailable"); + break; + } + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + { + NSError *error = (__bridge_transfer NSError *)CFReadStreamCopyError(stream); + if (error == nil && type == kCFStreamEventEndEncountered) + { + error = [asyncUdpSocket socketClosedError]; + } + + dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { + + LogCVerbose(@"CFReadStreamCallback - %@", + (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); + + if (stream != asyncUdpSocket->readStream4 && + stream != asyncUdpSocket->readStream6 ) + { + LogCVerbose(@"CFReadStreamCallback - Ignored"); + return_from_block; + } + + [asyncUdpSocket closeWithError:error]; + + }}); + + break; + } + default: + { + LogCError(@"CFReadStreamCallback - UnknownType: %i", (int)type); + } + } + } +} + +static void CFWriteStreamCallback(CFWriteStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; + + switch(type) + { + case kCFStreamEventOpenCompleted: + { + LogCVerbose(@"CFWriteStreamCallback - Open"); + break; + } + case kCFStreamEventCanAcceptBytes: + { + LogCVerbose(@"CFWriteStreamCallback - CanAcceptBytes"); + break; + } + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + { + NSError *error = (__bridge_transfer NSError *)CFWriteStreamCopyError(stream); + if (error == nil && type == kCFStreamEventEndEncountered) + { + error = [asyncUdpSocket socketClosedError]; + } + + dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { + + LogCVerbose(@"CFWriteStreamCallback - %@", + (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); + + if (stream != asyncUdpSocket->writeStream4 && + stream != asyncUdpSocket->writeStream6 ) + { + LogCVerbose(@"CFWriteStreamCallback - Ignored"); + return_from_block; + } + + [asyncUdpSocket closeWithError:error]; + + }}); + + break; + } + default: + { + LogCError(@"CFWriteStreamCallback - UnknownType: %i", (int)type); + } + } + } +} + +- (BOOL)createReadAndWriteStreams:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + NSError *err = nil; + + if (readStream4 || writeStream4 || readStream6 || writeStream6) + { + // Streams already created + return YES; + } + + if (socket4FD == SOCKET_NULL && socket6FD == SOCKET_NULL) + { + err = [self otherError:@"Cannot create streams without a file descriptor"]; + goto Failed; + } + + // Create streams + + LogVerbose(@"Creating read and write stream(s)..."); + + if (socket4FD != SOCKET_NULL) + { + CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket4FD, &readStream4, &writeStream4); + if (!readStream4 || !writeStream4) + { + err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket6FD, &readStream6, &writeStream6); + if (!readStream6 || !writeStream6) + { + err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv6]"]; + goto Failed; + } + } + + // Ensure the CFStream's don't close our underlying socket + + CFReadStreamSetProperty(readStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + CFWriteStreamSetProperty(writeStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + + CFReadStreamSetProperty(readStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + CFWriteStreamSetProperty(writeStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + + return YES; + +Failed: + if (readStream4) + { + CFReadStreamClose(readStream4); + CFRelease(readStream4); + readStream4 = NULL; + } + if (writeStream4) + { + CFWriteStreamClose(writeStream4); + CFRelease(writeStream4); + writeStream4 = NULL; + } + if (readStream6) + { + CFReadStreamClose(readStream6); + CFRelease(readStream6); + readStream6 = NULL; + } + if (writeStream6) + { + CFWriteStreamClose(writeStream6); + CFRelease(writeStream6); + writeStream6 = NULL; + } + + if (errPtr) + *errPtr = err; + + return NO; +} + +- (BOOL)registerForStreamCallbacks:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + NSError *err = nil; + + streamContext.version = 0; + streamContext.info = (__bridge void *)self; + streamContext.retain = nil; + streamContext.release = nil; + streamContext.copyDescription = nil; + + CFOptionFlags readStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; + CFOptionFlags writeStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; + +// readStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable); +// writeStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes); + + if (socket4FD != SOCKET_NULL) + { + if (readStream4 == NULL || writeStream4 == NULL) + { + err = [self otherError:@"Read/Write stream4 is null"]; + goto Failed; + } + + BOOL r1 = CFReadStreamSetClient(readStream4, readStreamEvents, &CFReadStreamCallback, &streamContext); + BOOL r2 = CFWriteStreamSetClient(writeStream4, writeStreamEvents, &CFWriteStreamCallback, &streamContext); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamSetClient(), [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + if (readStream6 == NULL || writeStream6 == NULL) + { + err = [self otherError:@"Read/Write stream6 is null"]; + goto Failed; + } + + BOOL r1 = CFReadStreamSetClient(readStream6, readStreamEvents, &CFReadStreamCallback, &streamContext); + BOOL r2 = CFWriteStreamSetClient(writeStream6, writeStreamEvents, &CFWriteStreamCallback, &streamContext); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamSetClient() [IPv6]"]; + goto Failed; + } + } + + return YES; + +Failed: + if (readStream4) { + CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); + } + if (writeStream4) { + CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); + } + if (readStream6) { + CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); + } + if (writeStream6) { + CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); + } + + if (errPtr) *errPtr = err; + return NO; +} + +- (BOOL)addStreamsToRunLoop:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + if (!(flags & kAddedStreamListener)) + { + [[self class] startListenerThreadIfNeeded]; + [[self class] performSelector:@selector(addStreamListener:) + onThread:listenerThread + withObject:self + waitUntilDone:YES]; + + flags |= kAddedStreamListener; + } + + return YES; +} + +- (BOOL)openStreams:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + NSError *err = nil; + + if (socket4FD != SOCKET_NULL) + { + BOOL r1 = CFReadStreamOpen(readStream4); + BOOL r2 = CFWriteStreamOpen(writeStream4); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamOpen() [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + BOOL r1 = CFReadStreamOpen(readStream6); + BOOL r2 = CFWriteStreamOpen(writeStream6); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamOpen() [IPv6]"]; + goto Failed; + } + } + + return YES; + +Failed: + if (errPtr) *errPtr = err; + return NO; +} + +- (void)removeStreamsFromRunLoop +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (flags & kAddedStreamListener) + { + [[self class] performSelector:@selector(removeStreamListener:) + onThread:listenerThread + withObject:self + waitUntilDone:YES]; + + flags &= ~kAddedStreamListener; + } +} + +- (void)closeReadAndWriteStreams +{ + LogTrace(); + + if (readStream4) + { + CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); + CFReadStreamClose(readStream4); + CFRelease(readStream4); + readStream4 = NULL; + } + if (writeStream4) + { + CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); + CFWriteStreamClose(writeStream4); + CFRelease(writeStream4); + writeStream4 = NULL; + } + if (readStream6) + { + CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); + CFReadStreamClose(readStream6); + CFRelease(readStream6); + readStream6 = NULL; + } + if (writeStream6) + { + CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); + CFWriteStreamClose(writeStream6); + CFRelease(writeStream6); + writeStream6 = NULL; + } +} + +#endif + +#if TARGET_OS_IPHONE +- (void)applicationWillEnterForeground:(NSNotification *)notification +{ + LogTrace(); + + // If the application was backgrounded, then iOS may have shut down our sockets. + // So we take a quick look to see if any of them received an EOF. + + dispatch_block_t block = ^{ @autoreleasepool { + + [self resumeReceive4Source]; + [self resumeReceive6Source]; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Advanced +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * See header file for big discussion of this method. + **/ +- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketNewTargetQueue +{ + void *nonNullUnusedPointer = (__bridge void *)self; + dispatch_queue_set_specific(socketNewTargetQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); +} + +/** + * See header file for big discussion of this method. + **/ +- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketOldTargetQueue +{ + dispatch_queue_set_specific(socketOldTargetQueue, IsOnSocketQueueOrTargetQueueKey, NULL, NULL); +} + +- (void)performBlock:(dispatch_block_t)block +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); +} + +- (int)socketFD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + if (socket4FD != SOCKET_NULL) + return socket4FD; + else + return socket6FD; +} + +- (int)socket4FD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + return socket4FD; +} + +- (int)socket6FD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + return socket6FD; +} + +#if TARGET_OS_IPHONE + +- (CFReadStreamRef)readStream +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NULL; + } + + NSError *err = nil; + if (![self createReadAndWriteStreams:&err]) + { + LogError(@"Error creating CFStream(s): %@", err); + return NULL; + } + + // Todo... + + if (readStream4) + return readStream4; + else + return readStream6; +} + +- (CFWriteStreamRef)writeStream +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NULL; + } + + NSError *err = nil; + if (![self createReadAndWriteStreams:&err]) + { + LogError(@"Error creating CFStream(s): %@", err); + return NULL; + } + + if (writeStream4) + return writeStream4; + else + return writeStream6; +} + +- (BOOL)enableBackgroundingOnSockets +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NO; + } + + // Why is this commented out? + // See comments below. + +// NSError *err = nil; +// if (![self createReadAndWriteStreams:&err]) +// { +// LogError(@"Error creating CFStream(s): %@", err); +// return NO; +// } +// +// LogVerbose(@"Enabling backgrouding on socket"); +// +// BOOL r1, r2; +// +// if (readStream4 && writeStream4) +// { +// r1 = CFReadStreamSetProperty(readStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// r2 = CFWriteStreamSetProperty(writeStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// +// if (!r1 || !r2) +// { +// LogError(@"Error setting voip type (IPv4)"); +// return NO; +// } +// } +// +// if (readStream6 && writeStream6) +// { +// r1 = CFReadStreamSetProperty(readStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// r2 = CFWriteStreamSetProperty(writeStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// +// if (!r1 || !r2) +// { +// LogError(@"Error setting voip type (IPv6)"); +// return NO; +// } +// } +// +// return YES; + + // The above code will actually appear to work. + // The methods will return YES, and everything will appear fine. + // + // One tiny problem: the sockets will still get closed when the app gets backgrounded. + // + // Apple does not officially support backgrounding UDP sockets. + + return NO; +} + +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Class Methods +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 +{ + char addrBuf[INET_ADDRSTRLEN]; + + if (inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + addrBuf[0] = '\0'; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + ++ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 +{ + char addrBuf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + addrBuf[0] = '\0'; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + ++ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 +{ + return ntohs(pSockaddr4->sin_port); +} + ++ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 +{ + return ntohs(pSockaddr6->sin6_port); +} + ++ (NSString *)hostFromAddress:(NSData *)address +{ + NSString *host = nil; + [self getHost:&host port:NULL family:NULL fromAddress:address]; + + return host; +} + ++ (uint16_t)portFromAddress:(NSData *)address +{ + uint16_t port = 0; + [self getHost:NULL port:&port family:NULL fromAddress:address]; + + return port; +} + ++ (int)familyFromAddress:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return af; +} + ++ (BOOL)isIPv4Address:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return (af == AF_INET); +} + ++ (BOOL)isIPv6Address:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return (af == AF_INET6); +} + ++ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr fromAddress:(NSData *)address +{ + return [self getHost:hostPtr port:portPtr family:NULL fromAddress:address]; +} + ++ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr family:(int *)afPtr fromAddress:(NSData *)address +{ + if ([address length] >= sizeof(struct sockaddr)) + { + const struct sockaddr *addrX = (const struct sockaddr *)[address bytes]; + + if (addrX->sa_family == AF_INET) + { + if ([address length] >= sizeof(struct sockaddr_in)) + { + const struct sockaddr_in *addr4 = (const struct sockaddr_in *)(const void *)addrX; + + if (hostPtr) *hostPtr = [self hostFromSockaddr4:addr4]; + if (portPtr) *portPtr = [self portFromSockaddr4:addr4]; + if (afPtr) *afPtr = AF_INET; + + return YES; + } + } + else if (addrX->sa_family == AF_INET6) + { + if ([address length] >= sizeof(struct sockaddr_in6)) + { + const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)(const void *)addrX; + + if (hostPtr) *hostPtr = [self hostFromSockaddr6:addr6]; + if (portPtr) *portPtr = [self portFromSockaddr6:addr6]; + if (afPtr) *afPtr = AF_INET6; + + return YES; + } + } + } + + if (hostPtr) *hostPtr = nil; + if (portPtr) *portPtr = 0; + if (afPtr) *afPtr = AF_UNSPEC; + + return NO; +} + +@end diff --git a/max/template/playbtest/playbtest/PlayB/MyTableViewCell.swift b/max/template/playbtest/playbtest/PlayB/MyTableViewCell.swift new file mode 100644 index 0000000..52a98a0 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/MyTableViewCell.swift @@ -0,0 +1,31 @@ +// +// MyTableViewCell.swift +// playbtest +// +// Created by mac on 2025/3/14. +// + +import UIKit + +class MyTableViewCell: UITableViewCell { + + @IBOutlet weak var contentData:UILabel! + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func awakeFromNib() { + super.awakeFromNib() + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + +} + diff --git a/max/template/playbtest/playbtest/PlayB/XUDPClient.h b/max/template/playbtest/playbtest/PlayB/XUDPClient.h new file mode 100644 index 0000000..b2499a0 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/XUDPClient.h @@ -0,0 +1,27 @@ +// +// XUDPClient.h +// xcmd +// +// Created by mac on 2025/2/17. +// + +#ifndef XUDPClient_h +#define XUDPClient_h + +#import + +#import "CocoaAsyncSocket.h" + +typedef void (^SendCallback) (NSString *msg); + +@interface XUDPClient : NSObject + +@property (nonatomic, copy) SendCallback hintBlock; + + ++(instancetype)sharedInstance; +- (void) onShow: (NSDictionary *)data; +- (void) onEnd: (NSDictionary *)data; +@end + +#endif /* XUDPClient_h */ diff --git a/max/template/playbtest/playbtest/PlayB/XUDPClient.m b/max/template/playbtest/playbtest/PlayB/XUDPClient.m new file mode 100644 index 0000000..bab68ae --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/XUDPClient.m @@ -0,0 +1,143 @@ +// +// XUDPClient.m +// xcmd +// +// Created by mac on 2025/2/17. +// + +#import + +#import "XUDPClient.h" + +#define HOST @"127.0.0.1" +#define PORT 6001 + + +@interface XUDPClient() { +@private + GCDAsyncUdpSocket *_udpSocket; +} + +@end + + +@implementation XUDPClient ++(instancetype)sharedInstance +{ + static XUDPClient* _sharedInstance = nil; + static dispatch_once_t oncePredicate; + dispatch_once (&oncePredicate, ^{ + _sharedInstance = [[XUDPClient alloc] init]; + }); + return _sharedInstance; +} +-(instancetype)init { + if (self = [super init]) { + [self start]; + return self; + } + return nil; +} + +- (void) start +{ + if (!_udpSocket) + { + _udpSocket=nil; + } + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + _udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:queue]; + NSError *error = nil; + if (![_udpSocket bindToPort:0 error:&error]) + { + NSLog(@"Error binding: %@", error); + return; + } + if (![_udpSocket beginReceiving:&error]) + { + NSLog(@"Error receiving: %@", error); + return; + } +} +- (void) close +{ + if(_udpSocket) { + [_udpSocket closeAfterSending]; + } +} +- (NSString *)dic2Json: (NSDictionary *)dict { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict + options:NSJSONWritingPrettyPrinted + error:&error]; + if (error) { + NSLog(@"dic2json err:%@", error); + } + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; +} + +- (void) onShow: (NSDictionary *)data { + NSDictionary *rq = @{ + @"url": @"/adtask/show", + @"body": data + }; + [self send:[self dic2Json: rq]]; +} + +- (void) onEnd: (NSDictionary *)data { + NSDictionary *rq = @{ + @"url": @"/adtask/end", + @"body": data + }; + [self send:[self dic2Json: rq]]; +} + +- (void) send: (NSString*) msg { + NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding]; + [_udpSocket sendData:data toHost:HOST port:PORT withTimeout:-1 tag:300]; +} +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address +{ + NSError *error = nil; + NSLog(@"Message didConnectToAddress: %@",[[NSString alloc]initWithData:address encoding:NSUTF8StringEncoding]); + [_udpSocket beginReceiving:&error]; +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError *)error +{ + NSLog(@"Message didNotConnect: %@",error); +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error +{ + NSLog(@"Message didNotSendDataWithTag: %@",error); +} + +- (NSDictionary *) json2dic: (NSString *) jsstr { + NSError *jsonError; + NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[jsstr dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingMutableContainers + error:&jsonError]; + if (jsonError) { + NSLog(@"json2dic error: %@", jsonError); + } + return dic; +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext +{ + NSString *revDada =[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; + NSLog(@"Message didReceiveData :%@", revDada); + if(self.hintBlock) { + self.hintBlock(revDada); + } + +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag +{ + NSLog(@"Message 发送成功"); +} + + +@end diff --git a/max/template/playbtest/playbtest/PlayB/YL_NetWorkManager.swift b/max/template/playbtest/playbtest/PlayB/YL_NetWorkManager.swift new file mode 100644 index 0000000..0cb19e4 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/YL_NetWorkManager.swift @@ -0,0 +1,1354 @@ +// +// YL_NetWorkManager.swift +// wallpaper_project +// Created by 忆海16 on 2024/9/29. +// + +import Foundation +import UIKit +import AdSupport +import CoreTelephony +import Network +import SystemConfiguration +import AVFoundation +import OpenGLES +import AppTrackingTransparency +import CommonCrypto + + +/// <#Description#> +class YL_NetWorkManager{ + static var kBaseUrl = YL_NetWorkManager.bFaceLocalUrl() + + static var kURL_AD_Start = "/top_selection/save_app_start_log" + static var kURL_AD_Load = "/top_selection/save_ad_load_log" + static var kURL_AD_Show = "/top_selection/save_ad_show_log" + static var kURL_save_logs = "/ios/top_selection/save_iphone_logs" + + var ipLoadTime: DispatchTime? + + static var kLocalBaseUrl = BbbAdManager.config.adbrush_local_url + + + static var kLocalUrlStr: (String) -> String { + return { path in + return "\(self.kLocalBaseUrl)/\(path)" + } + } + + + static func bFaceLocalUrl() -> String { + + return BbbAdManager.config.adbrush_base_url + + } + + + + typealias LuxNetManagerCallback = (Error?, Bool, [String: Any]?) -> Void + + + + static func uploadData(mdic: [String: Any], urlPath: String, callback: @escaping (Error?, Bool, [String: Any]?) -> Void) { + guard let url = URL(string: urlPath) else { + print("Invalid URL") + return + } + + print("---------mdic \(mdic)") + + print("---------urlPath\(urlPath)") + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + do { + let data = try JSONSerialization.data(withJSONObject: mdic, options: []) + request.httpBody = data + } catch { + print("Error serializing JSON: \(error.localizedDescription)") + + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Error serializing JSON: \(error.localizedDescription)" + ]) + } + + return + } + + let task = URLSession.shared.dataTask(with: request) { (data, response, error) in + if let error = error { + callback(error, false, nil) + print("Network error: \(error.localizedDescription)") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Network error: \(error.localizedDescription)" + ]) + } + } else { + guard let data = data else { + callback(nil, false, nil) + print("No data received") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"No data received" + ]) + } + return + } + + do { + if let result = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { + print("Server response: \(result)") + callback(nil, true, result) + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Server response: \(result)" + ]) + } + + } + } catch { + callback(error, false, nil) + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Error parsing response JSON: \(error.localizedDescription)" + ]) + } + + + + print("Error parsing response JSON: \(error.localizedDescription)") + } + } + } + + task.resume() + } + + + // 请求远程IP + func requestRemoteIp() { + ipLoadTime = DispatchTime.now() + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "获取ip中..."]) + + guard let url = URL(string: "https://openapi.lux-ad.com/app/common/getIPInfo") else { return } + let request = URLRequest(url: url) + let task = URLSession.shared.dataTask(with: request) { data, response, error in + if let error = error { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + return + } + + guard let data = data, + let result = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], + let ip = result["data"] as? [String: Any], + let ipAddress = ip["ip"] as? String, + let isoCode = ip["isoCode"] as? String else { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + return + } + + if !ipAddress.isEmpty { + UserDefaults.standard.set(ipAddress, forKey: "kIP_key") + UserDefaults.standard.set(isoCode, forKey: "kIP_key_isoCode") + UserDefaults.standard.synchronize() + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "当前ip: \(ipAddress) \n国家: \(isoCode) "]) + } + + if let startTime = self.ipLoadTime { + let loadDuration = self.IpcalculateElapsedTime(since: startTime) + BbbAdManager.config.ipTime = loadDuration + } + + } else { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + } + } + task.resume() + } + + + // 辅助函数以毫秒为单位计算经过的时间 + private func IpcalculateElapsedTime(since startTime: DispatchTime) -> Int { + let endTime = DispatchTime.now() + let nanoseconds = endTime.uptimeNanoseconds - startTime.uptimeNanoseconds + return Int(nanoseconds / 1_000_000) // 转换为毫秒 + } + + + // DeviceId + + static func getDeviceId() -> String { + var adbrushDeviceId = UserDefaults.standard.dictionary(forKey: "bfaceDictKey")?["adbrush_deviceid"] as? String + if adbrushDeviceId == nil { + adbrushDeviceId = UIDevice.current.identifierForVendor?.uuidString + var bfaceDict = UserDefaults.standard.dictionary(forKey: "bfaceDictKey") ?? [:] + bfaceDict["adbrush_deviceid"] = adbrushDeviceId + UserDefaults.standard.set(bfaceDict, forKey: "bfaceDictKey") + UserDefaults.standard.synchronize() + } + + return adbrushDeviceId ?? "" + } + + + // 本地IP + static func getLocalIp() -> String { + var address = "an error occurred when obtaining ip address" + var interfaces: UnsafeMutablePointer? = nil + + if getifaddrs(&interfaces) == 0 { + var tempAddr = interfaces + + while tempAddr != nil { + let addrFamily = tempAddr!.pointee.ifa_addr.pointee.sa_family + let name = String(cString: tempAddr!.pointee.ifa_name) + + if addrFamily == AF_INET && name == "en0" { + var ipAddress = sockaddr_in() + memcpy(&ipAddress, tempAddr!.pointee.ifa_addr, MemoryLayout.size) + address = String(cString: inet_ntoa(ipAddress.sin_addr)) + } + tempAddr = tempAddr!.pointee.ifa_next + } + freeifaddrs(interfaces) + } + return address + } + + + // 包名 + static func getPackageName() -> String { + return Bundle.main.bundleIdentifier ?? "" + } + + // 版本 + static func getappVersion() -> String { + + return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "" + + } + + // 手机型号 + static func getiphone() -> String { + + return UIDevice.current.localizedModel + + } + + // 系统版本 + static func getosVersion() -> String { + + return UIDevice.current.systemVersion + + } + + // 电池电量 + static func getBatteryLevel() -> Float? { + return UIDevice.current.batteryLevel + } + + // 是否在充电 + static func isDeviceCharging() -> Bool { + return UIDevice.current.batteryState == .charging || UIDevice.current.batteryState == .full + } + + // 获取deviceId + static func getPhoneDeviceId() -> String? { + return UIDevice.current.identifierForVendor?.uuidString + } + + // 当前的无线接入技术 + static func getCurrentRadioAccessTechnology() -> String? { + let networkInfo = CTTelephonyNetworkInfo() + let radioAccessTechnology = networkInfo.currentRadioAccessTechnology + return radioAccessTechnology + } + + + + // 时间 + static func getCurrentTime() -> String { + let date = Date() // 获取当前日期和时间 + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" // 设置日期格式 + formatter.locale = Locale(identifier: "en_US_POSIX") // 确保使用 ISO 8601 标准 + return formatter.string(from: date) + } + + // 字体 + static func getCurrentFont() -> String { + return "\(UIFont.systemFont(ofSize: UIFont.systemFontSize))" + } + + // 语言 + static func getlanguageCode() -> String { + return Locale.current.languageCode ?? "" + } + + + //GAID + + static func getGaid() -> String { + return ASIdentifierManager.shared().advertisingIdentifier.uuidString + } + + + // IDFA + static func getIdfa() -> String { + if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + return idfa + } else { + return "" + } + } + + // monotonicRawClockTimeMillis 单调时钟时间戳 + static func getMonotonicRawClockTimeMillis() -> UInt64 { + let time = mach_absolute_time() + let nanoseconds = Double(time) / Double(NSEC_PER_SEC) // Convert to nanoseconds + return UInt64(nanoseconds / 1000000) // Convert to milliseconds + } + + // 内核启动时间戳 + static func getKernelBootTimeMillis() -> Int64? { + // 定义变量以存储系统启动时间 + var bootTime = timeval() + var size = MemoryLayout.stride + + // 获取系统启动时间 + let mib: [Int32] = [CTL_KERN, KERN_BOOTTIME] + let result = sysctl(UnsafeMutablePointer(mutating: mib), 2, &bootTime, &size, nil, 0) + + guard result == 0 else { + print("获取系统启动时间失败") + return nil + } + + // 系统启动时间(秒 + 微秒) + let bootTimeInSeconds = Double(bootTime.tv_sec) + Double(bootTime.tv_usec) / 1_000_000 + + // 当前时间 + let currentTime = Date().timeIntervalSince1970 + + // 计算内核运行的时间(秒) + let kernelBootTimeInSeconds = currentTime - bootTimeInSeconds + + // 转换为毫秒 + return Int64(kernelBootTimeInSeconds * 1_000) + } + + + // 获取运营商信息 + static func getCarrierInfo() -> String { + var carrierInfo = "" + let networkInfo = CTTelephonyNetworkInfo() + let carrier = networkInfo.serviceSubscriberCellularProviders?.first?.value + if let carrier = carrier { + carrierInfo = "\(carrier.mobileCountryCode ?? "") \(carrier.mobileNetworkCode ?? "")" + } + return carrierInfo + } + + // 获取网络连接类型 + static func getNetworkType() -> String { + let monitor = NWPathMonitor() + let queue = DispatchQueue.global(qos: .background) + + var type:String = "" + + monitor.pathUpdateHandler = { path in + if path.status == .satisfied { + if path.usesInterfaceType(.wifi) { + type = "Wi-Fi" + } else if path.usesInterfaceType(.cellular) { + type = "Cellular" + } else if path.usesInterfaceType(.wiredEthernet) { + type = "Wired Ethernet" + } else if path.usesInterfaceType(.loopback) { + type = "Loopback" + } else { + type = "Other" + } + } else { + type = "Unavailable" + } + monitor.cancel() // 停止监控,释放资源 + } + + monitor.start(queue: queue) + return type + } + + // 是否连接VPN + static func isVPNOn() -> Bool { + var flag = false + let version = UIDevice.current.systemVersion + + // Check if the system version is >= 9.0 + if let versionDouble = Double(version), versionDouble >= 9.0 { + // For iOS 9.0 and above + if let dict = CFNetworkCopySystemProxySettings() as? Unmanaged { + let bridgedDict = dict.takeUnretainedValue() as? [String: Any] + + if let scopedSettings = bridgedDict?["__SCOPED__"] as? [String: Any] { + for key in scopedSettings.keys { + if key.contains("tap") || key.contains("tun") || key.contains("ipsec") || key.contains("ppp") { + flag = true + break + } + } + } + } + } else { + // For iOS versions below 9.0 + var interfaces: UnsafeMutablePointer? + let success = getifaddrs(&interfaces) + + if success == 0 { + var tempAddr = interfaces + while tempAddr != nil { + if let name = String(validatingUTF8: (tempAddr?.pointee.ifa_name)!) { + if name.contains("tap") || name.contains("tun") || name.contains("ipsec") || name.contains("ppp") { + flag = true + break + } + } + tempAddr = tempAddr?.pointee.ifa_next + } + } + + // Free memory + freeifaddrs(interfaces) + } + + return flag + } + + + + static func appId() -> String { + return Bundle.main.bundleIdentifier ?? "" + } + + + // 获取音量 + static func isDeviceMuted() -> Bool { + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setActive(true) + // 获取当前音量 + let currentVolume = audioSession.outputVolume + return currentVolume == 0 + } catch { + print("Error setting audio session active: \(error.localizedDescription)") + return false + } + } + + // 追踪状态 + static func getAdvertisingTrackingStatus() -> String { + if #available(iOS 14, *) { + switch ATTrackingManager.trackingAuthorizationStatus { + case .notDetermined: + return "notDetermined" + case .restricted: + return "restricted" + case .denied: + return "denied" + case .authorized: + return "authorized" + @unknown default: + return "unknown" + } + } else { + // iOS 14 以下版本 + let isTrackingEnabled = ASIdentifierManager.shared().isAdvertisingTrackingEnabled + return isTrackingEnabled ? "authorized" : "denied" + } + } + + // 是否启用追踪 + static func isAdvertisingTrackingEnabled() -> Bool { + if #available(iOS 14, *) { + switch ATTrackingManager.trackingAuthorizationStatus { + case .authorized: + return true // 用户允许广告追踪 + default: + return false // 用户未授权、受限制或拒绝 + } + } else { + // iOS 14 以下版本 + return ASIdentifierManager.shared().isAdvertisingTrackingEnabled + } + } + + // 获取设备总内存 + + static func getTotalMemoryInBytes() -> UInt64 { + return ProcessInfo.processInfo.physicalMemory + } + + static func getTotalMemoryInReadableFormat() -> String { + let totalMemoryBytes = getTotalMemoryInBytes() + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useGB] // 只显示为 GB + formatter.countStyle = .memory + return formatter.string(fromByteCount: Int64(totalMemoryBytes)) + } + + + // 是否是刘海屏 + static func isNotchScreen() -> Bool { + // 确保在主线程中访问 + if Thread.isMainThread { + guard let window = UIApplication.shared.windows.first else { return false } + let topSafeArea = window.safeAreaInsets.top + return topSafeArea > 20 + } else { + // 在非主线程中调用时,通过调度回主线程同步获取结果 + return DispatchQueue.main.sync { + guard let window = UIApplication.shared.windows.first else { return false } + let topSafeArea = window.safeAreaInsets.top + return topSafeArea > 20 + } + } + } + + + // 屏幕方向 + + static func getScreenOrientation() -> String { + let orientation = UIDevice.current.orientation + + switch orientation { + case .portrait: + return "portrait" + case .portraitUpsideDown: + return "portraitUpsideDown" + case .landscapeLeft: + return "landscapeLeft" + case .landscapeRight: + return "landscapeRight" + case .faceUp: + return "faceUp" + case .faceDown: + return "faceDown" + case .unknown: + return "unknown" + @unknown default: + return "unknown" + } + } + + // 获取 OpenGL版本 + static func getOpenGLVersion() -> String { + // 尝试初始化 OpenGL ES 3.0 上下文 + if let _ = EAGLContext(api: .openGLES3) { + return "openGLES3" + } + // 尝试初始化 OpenGL ES 2.0 上下文 + else if let _ = EAGLContext(api: .openGLES2) { + return "openGLES2" + } + // 如果上述都失败,则返回 OpenGL ES 1.0 + else if let _ = EAGLContext(api: .openGLES1) { + return "openGLES1" + } else { + return "NO OpenGL ES" + } + } + + // 获取时区偏移量 + static func getTimeZoneOffsetFromUS() -> Int { + // 获取当前设备的时区 + let currentTimeZone = TimeZone.current + + // 获取美国东部时间的时区(美区时区) + let usTimeZone = TimeZone(identifier: "America/New_York") + + // 获取两个时区的偏移量,单位为秒 + let currentOffset = currentTimeZone.secondsFromGMT() + let usOffset = usTimeZone?.secondsFromGMT() ?? 0 + + // 计算偏移差,并将结果转为分钟 + let offsetDifferenceInMinutes = (currentOffset - usOffset) / 60 + return offsetDifferenceInMinutes + } + + // 设备键盘类型 + static func getKeyboardLayoutType() -> [String] { + var keyboardLayouts: [String] = [] + + // 获取当前设备的语言环境 + let currentLanguage = Locale.current.languageCode ?? "" + + // 根据语言环境推测键盘布局类型 + switch currentLanguage { + case "en": + // 英语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "fr": + // 法语一般使用 AZERTY 布局 + keyboardLayouts.append("AZERTY") + case "de": + // 德语一般使用 QWERTZ 布局 + keyboardLayouts.append("QWERTZ") + case "es": + // 西班牙语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "it": + // 意大利语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "ja": + // 日语一般使用日本输入法 + keyboardLayouts.append("Japanese") + case "zh": + // 中文一般使用拼音输入法 + keyboardLayouts.append("Pinyin") + default: + // 其他语言暂时返回 QWERTY + keyboardLayouts.append("QWERTY") + } + + return keyboardLayouts + } + + + // 设备型号修订版 + static func getDeviceHardwareIdentifier() -> String { + var size: Int = 0 // 使用 Int 类型而不是 UInt32 + sysctlbyname("hw.model", nil, &size, nil, 0) + + var model = [CChar](repeating: 0, count: size) + sysctlbyname("hw.model", &model, &size, nil, 0) + + let modelString = String(cString: model) + return modelString + } + + // static func mapHardwareIdentifierToModelNumber(_ identifier: String) -> String { + // switch identifier { + // // iPhone 系列 + // case "iPhone13,2": + // return "A2172" // iPhone 12 + // case "iPhone13,3": + // return "A2341" // iPhone 12 Pro + // case "iPhone13,4": + // return "A2342" // iPhone 12 Pro Max + // case "iPhone13,1": + // return "A2176" // iPhone 12 mini + // case "iPhone12,1": + // return "A2111" // iPhone 11 + // case "iPhone12,3": + // return "A2160" // iPhone 11 Pro + // case "iPhone12,5": + // return "A2161" // iPhone 11 Pro Max + // case "iPhone11,8": + // return "A1882" // iPhone XR + // case "iPhone11,2": + // return "A1920" // iPhone XS + // case "iPhone11,6": + // return "A1921" // iPhone XS Max + // case "iPhone10,3": + // return "A1865" // iPhone X + // case "iPhone10,6": + // return "A1901" // iPhone X + // case "iPhone9,1": + // return "A1660" // iPhone 7 + // case "iPhone9,2": + // return "A1661" // iPhone 7 Plus + // case "iPhone8,1": + // return "A1549" // iPhone 6s + // case "iPhone8,2": + // return "A1586" // iPhone 6s Plus + // case "iPhone7,1": + // return "A1522" // iPhone 6 Plus + // case "iPhone7,2": + // return "A1549" // iPhone 6 + // case "iPhone6,1": + // return "A1528" // iPhone 5s + // case "iPhone6,2": + // return "A1530" // iPhone 5s + // case "iPhone5,1": + // return "A1428" // iPhone 5 + // case "iPhone5,2": + // return "A1429" // iPhone 5 + // + // // iPad 系列 + // case "iPad8,1": + // return "A1893" // iPad Air 3 + // case "iPad8,2": + // return "A1894" // iPad Air 3 + // case "iPad8,3": + // return "A1954" // iPad Pro 10.5" + // case "iPad8,4": + // return "A1955" // iPad Pro 10.5" + // case "iPad8,5": + // return "A1701" // iPad Pro 12.9" (2nd generation) + // case "iPad8,6": + // return "A1709" // iPad Pro 12.9" (2nd generation) + // case "iPad8,7": + // return "A1673" // iPad Pro 12.9" (3rd generation) + // case "iPad8,8": + // return "A1674" // iPad Pro 12.9" (3rd generation) + // + // // iPad Mini 系列 + // case "iPad4,4": + // return "A1454" // iPad Mini 2 + // case "iPad4,5": + // return "A1455" // iPad Mini 2 + // case "iPad4,6": + // return "A1456" // iPad Mini 2 + // case "iPad5,1": + // return "A1822" // iPad Mini 4 + // case "iPad5,2": + // return "A1823" // iPad Mini 4 + // + // // iPad Pro 系列 + // case "iPad6,7": + // return "A1652" // iPad Pro 12.9" (1st generation) + // case "iPad6,8": + // return "A1670" // iPad Pro 12.9" (1st generation) + // case "iPad7,1": + // return "A1674" // iPad Pro 12.9" (2nd generation) + // case "iPad7,2": + // return "A1673" // iPad Pro 12.9" (2nd generation) + // + // // Apple Watch 系列 + // case "Watch1,1": + // return "A1554" // Apple Watch (1st generation) + // case "Watch1,2": + // return "A1553" // Apple Watch (1st generation) + // case "Watch2,6": + // return "A1792" // Apple Watch Series 1 + // case "Watch2,7": + // return "A1791" // Apple Watch Series 1 + // case "Watch3,1": + // return "A1860" // Apple Watch Series 3 + // case "Watch3,2": + // return "A1861" // Apple Watch Series 3 + // case "Watch3,3": + // return "A1889" // Apple Watch Series 3 + // case "Watch3,4": + // return "A1890" // Apple Watch Series 3 + // case "Watch4,1": + // return "A1975" // Apple Watch Series 4 + // case "Watch4,2": + // return "A1976" // Apple Watch Series 4 + // case "Watch4,3": + // return "A1977" // Apple Watch Series 4 + // case "Watch4,4": + // return "A1978" // Apple Watch Series 4 + // + // // Apple TV 系列 + // case "AppleTV5,3": + // return "A1469" // Apple TV (4th generation) + // case "AppleTV6,2": + // return "A1842" // Apple TV 4K (1st generation) + // case "AppleTV11,1": + // return "A2169" // Apple TV 4K (2nd generation) + // default: + // return "Unknown model" + // } + // } + + + +// static func uploadAD_Load(adid:String,ecpm:Double,network:String,countryCode:String,platformResponseTime:TimeInterval,dsp:String,loadTime:Int){ +// +// var mdic: [String: Any] = [:] +// +// mdic["deviceId"] = starManager.shared.adbrush_deviceid +// mdic["gaid"] = self.getGaid() +// mdic["localIp"] = starManager.shared.adbrush_localip +// +// // let remoteIp = UserDefaults.standard.string(forKey: "kIP_key") ?? "" +// mdic["remoteIp"] = starManager.shared.remouteIP +// +// mdic["packageName"] = appId() +// mdic["adPlatform"] = "MAX" +// mdic["countryCode"] = countryCode +// mdic["adId"] = adid +// mdic["platformResponseTime"] = platformResponseTime +// mdic["shelfNumber"] = "uploadAD_Load" +// mdic["ecpm"] = ecpm +// mdic["getIpResponseTime"] = starManager.shared.ipTime +// mdic["dsp"] = dsp +// mdic["dataId"] = starManager.shared.dataId +// mdic["linkId"] = starManager.shared.linkId +// mdic["loadTime"] = loadTime +// mdic["succeed"] = true +// mdic["network"] = network +// mdic["online"] = false +// mdic["washParam"] = starManager.shared.washParam +// +// // Log the JSON data to verify it's correctly formatted +// do { +// let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) +// let jsonString = String(data: jsonData, encoding: .utf8) ?? "" +// print("Uploading AD Show with data: \(jsonString)") +// +// DispatchQueue.main.sync { +// NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "uploadAD_Load:\n\(jsonString)"]) +// } +// +// +// YL_NetWorkManager.uploadData(mdic: mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Load)") { err, state, result in +// if let error = err { +// print("Error: \(error.localizedDescription)") +// } else { +// print("Result: \(result ?? [:])") +// DispatchQueue.main.async { +// NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "AdID: \(adid) 广告加载成功, ecpm: \(ecpm) 加载时长: 0ms dsp: \( "MAX") network: \(network)"]) +// } +// +// } +// } +// +// +// } catch { +// print("Error serializing JSON: \(error.localizedDescription)") +// } +// +// +// } + + static func uploadAD_Load( + adid: String, + ecpm: Double, + network: String, + countryCode: String, + platformResponseTime: TimeInterval, + dsp: String, + loadTime: Int, + retryCount: Int = 3 // 默认重试3次 + ) { + var mdic: [String: Any] = [:] + + mdic["deviceId"] = BbbAdManager.config.adbrush_deviceid + mdic["gaid"] = self.getGaid() + mdic["localIp"] = BbbAdManager.config.adbrush_localip + mdic["remoteIp"] = BbbAdManager.config.remouteIP + mdic["packageName"] = appId() + mdic["adPlatform"] = "MAX" + mdic["countryCode"] = countryCode + mdic["adId"] = adid + mdic["platformResponseTime"] = platformResponseTime + mdic["shelfNumber"] = "uploadAD_Load" + mdic["ecpm"] = ecpm + mdic["getIpResponseTime"] = BbbAdManager.config.ipTime + mdic["dsp"] = dsp + mdic["dataId"] = BbbAdManager.config.dataId + mdic["linkId"] = BbbAdManager.config.linkId + mdic["loadTime"] = loadTime + mdic["succeed"] = true + mdic["network"] = network + mdic["online"] = false + mdic["washParam"] = BbbAdManager.config.washParam + + // Log the JSON data to verify it's correctly formatted + do { + let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + print("Uploading AD Show with data: \(jsonString)") + + + + // 上传数据 + YL_NetWorkManager.uploadData(mdic: mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Load)") { err, state, result in + if let error = err { + print("Error: \(error.localizedDescription)") + + if retryCount > 0 { + print("Retrying... Remaining attempts: \(retryCount - 1)") + // 延迟1秒后重试 + DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + 1.0) { + uploadAD_Load( + adid: adid, + ecpm: ecpm, + network: network, + countryCode: countryCode, + platformResponseTime: platformResponseTime, + dsp: dsp, + loadTime: loadTime, + retryCount: retryCount - 1 + ) + } + } else { + print("Failed to upload data after \(3 - retryCount) retries.") + } + } else { + print("Result: \(result ?? [:])") + } + } + } catch { + print("Error serializing JSON: \(error.localizedDescription)") + } + } + + + + static func uploadAD_Show(adid:String,ecpm:Double,network:String,countryCode:String,platformResponseTime:TimeInterval,dsp:String){ + + var mdic: [String: Any] = [:] + + mdic["deviceId"] = BbbAdManager.config.adbrush_deviceid + mdic["gaid"] = self.getGaid() + mdic["localIp"] = BbbAdManager.config.adbrush_localip + + // let remoteIp = UserDefaults.standard.string(forKey: "kIP_key") ?? "" + mdic["remoteIp"] = BbbAdManager.config.remouteIP + + mdic["packageName"] = appId() + mdic["adPlatform"] = "MAX" + mdic["countryCode"] = countryCode + mdic["adId"] = adid + mdic["platformResponseTime"] = platformResponseTime + mdic["shelfNumber"] = "uploadAD_Load" + mdic["ecpm"] = ecpm + mdic["getIpResponseTime"] = BbbAdManager.config.ipTime + mdic["dsp"] = dsp + mdic["dataId"] = BbbAdManager.config.dataId + mdic["linkId"] = BbbAdManager.config.linkId + mdic["loadTime"] = 0 + mdic["succeed"] = true + mdic["network"] = network + mdic["online"] = false + + do { + // Log the JSON data to verify it's correctly formatted + let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + print("Uploading AD Show with data: \(jsonString)") + YL_NetWorkManager.uploadData(mdic:mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Show)") { (err, state, result) in + if let error = err { + print("Error uploading AD Show: \(error.localizedDescription)") + } else { + print("Upload AD Show response: \(result ?? [:])") + } + } + } catch { + print("Error serializing JSON: \(error.localizedDescription)") + } + + + } + + + + /* + + static func showAd(idfa: String, + adId: String, + ecpm: Double?, + ad: Bool) { + + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["ecpm"] = ecpm ?? 0 + mdic["ad"] = ad + mdic["id"] = adId + + uploadData(mdic: mdic, urlPath: kLocalUrlStr("adtask/show")) { err, state, result in + guard let status = result?["status"] as? String, + let time = result!["close"] as? NSNumber else { + + return + } + + if status == "Success" && ad { + + closeAD.removeADVC(byDelayTime: time.intValue) + // closeWindows.removeADVCByDelayTime(time.intValue) + } + DispatchQueue.main.async { + + NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "showAd,已上传展示AD操作,\(time.intValue / 1000)秒后关闭"]) + } + + if ad { + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: [ + "info": "AdID:\(adId),广告开始展示,展示时长\(time)" + ]) + } + } + } + } + */ + static func convertStringToDictionary(text: String) -> [String:AnyObject]? { + if let data = text.data(using: String.Encoding.utf8) { + do { + return try JSONSerialization.jsonObject(with: data, options: [JSONSerialization.ReadingOptions.init(rawValue: 0)]) as? [String:AnyObject] + } catch let error as NSError { + print(error) + } + } + return nil + } + + static func showAd(adId: String, + ecpm: Double?, + ad: Bool) { + + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["ecpm"] = ecpm ?? 0 + mdic["ad"] = ad + mdic["id"] = adId + + let client:XUDPClient = XUDPClient.sharedInstance() + client.hintBlock = { (t:String?) in + guard let jsonStr = t else { + return + } + let result = convertStringToDictionary(text: jsonStr) + guard let status = result?["status"] as? String, + let time = result!["close"] as? NSNumber else { + + return + } + + if status == "Success" && ad { + + closeAD.removeADVC(byDelayTime: time.intValue) + // closeWindows.removeADVCByDelayTime(time.intValue) + } + + } + + client.onShow(mdic); + } + static func loadend(max_ecpm:Double){ + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["max_ecpm"] = max_ecpm + + let client:XUDPClient = XUDPClient.sharedInstance() + client.hintBlock = { (t:String?) in + guard let jsonStr = t else { + return + } + let result = convertStringToDictionary(text: jsonStr) + + // 解析返回的 JSON 数据 + if let resultDict = result, + let status = resultDict["status"] as? String, + let restart = resultDict["restart"] as? Bool { + + // 打印返回的状态 + print("状态: \(status)") + + if restart { + // 如果 restart 为 true,重新加载广告 + print("重新加载广告展示") + // BbbAdManager.config.isadload = 0 + // 调用广告加载的函数 + + + // starManager.shared.isadsureshow = true + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "重新加载广告展示"]) + } + + + } else { + // restart 为 false,不需要处理 + print("不需要重新加载广告,程序后续会被杀掉") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "不需要重新加载广告,程序后续会被杀掉"]) + } + } + } else { + print("返回数据格式错误") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "返回数据格式错误"]) + } + } + } + + client.onEnd(mdic); + } + + /* + static func loadend(max_ecpm:Double){ + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["max_ecpm"] = max_ecpm + + uploadData(mdic: mdic, urlPath:kLocalUrlStr("adtask/end")) { err, state, result in + // 检查是否有错误 + guard err == nil else { + print("请求失败: \(String(describing: err))") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "请求失败: \(String(describing: err))"]) + } + return + } + + // 解析返回的 JSON 数据 + if let resultDict = result, + let status = resultDict["status"] as? String, + let restart = resultDict["restart"] as? Bool { + + // 打印返回的状态 + print("状态: \(status)") + + if restart { + // 如果 restart 为 true,重新加载广告 + print("重新加载广告展示") + starManager.shared.isadload = 0 + // 调用广告加载的函数 + + for (index, adId) in starManager.shared.adids.enumerated() { + DispatchQueue.main.asyncAfter(deadline: .now() + Double(index) * 2) { // 每隔 4 秒加载一个广告 + YL_AdManager.shared.addInterstitialAdItem(adId: adId) + } + } + starManager.shared.isadsureshow = true + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "重新加载广告展示"]) + } + + + } else { + // restart 为 false,不需要处理 + print("不需要重新加载广告,程序后续会被杀掉") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "不需要重新加载广告,程序后续会被杀掉"]) + } + } + } else { + print("返回数据格式错误") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "返回数据格式错误"]) + } + } + } + + } + + */ + + + static func saveIphonelogs() { + let processInfo = ProcessInfo.processInfo + let screenSize = UIScreen.main.bounds.size + let width = Int(screenSize.width) + let height = Int(screenSize.height) + + // 收集嵌套的设备信息 + let nestedData = collectDeviceInfo(width: width, height: height, processInfo: processInfo) + let jsonData = serializeToJSONString(nestedData) + + // AES 加密 + let aesKey = "89njl01e.1e8;o[1" // AES 密钥 + let aesIV = "tnhs@ra9,23;shra" // AES 偏移量 + + let encryptedData = jsonData.aesEncrypt(key: aesKey, iv: aesIV) + print("Encrypted text: \(encryptedData ?? "" )") + + if let decrypted = encryptedData?.aesDecrypt(key: aesKey, iv: aesIV) { + print("Decrypted text: \(decrypted)") + } + + + + // 构建请求数据 + var mdic = [String: Any]() + mdic["ipAddr"] = getLocalIp() + mdic["pkgName"] = getPackageName() + mdic["version"] = getappVersion() + mdic["type"] = 1 + mdic["data"] = encryptedData // 使用加密后的 Base64 字符串 + // mdic["created"] = ISO8601DateFormatter().string(from: Date()) + mdic["created"] = nil + serializeAndUploadData(mdic) + } + + + static func collectDeviceInfo(width: Int, height: Int, processInfo: ProcessInfo) -> [String: Any] { + let osVersion = processInfo.operatingSystemVersion + let osVersionString = "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)" + + return [ + "deviceModel": getIpne.shard.getIPhoneModel().getName(), + "osVersion": getosVersion(), + "batteryLevel": getBatteryLevel() ?? 0.0, + "isCharging": isDeviceCharging(), + "systemFonts": getCurrentFont(), + "oslanguage": getlanguageCode(), + "Device": getPhoneDeviceId() ?? "", + "processID": processInfo.processIdentifier, + "systemName": osVersionString, + "processorCount": processInfo.processorCount, + "physicalMemory": Double(processInfo.physicalMemory) / 1024.0 / 1024.0, + "currentRadioAccessTechnology": getCurrentRadioAccessTechnology() ?? "", + "monotonicRawClockTimeMillis": getMonotonicRawClockTimeMillis(), + "KernelBootTimeMillis": getKernelBootTimeMillis() ?? 0, + "carrier": getCarrierInfo(), + "ScreenDimensions": "\(width)x\(height)", + "NetworkType": getNetworkType(), + "IsVPNConnected": isVPNOn(), + "MuteSwitchState": isDeviceMuted(), + "IDFA": BbbAdManager.config.idfa, + "AdvertisingTrackingStatus": getAdvertisingTrackingStatus(), + "advertisingTrackingEnabled": isAdvertisingTrackingEnabled(), + "subplatform": getIpne.shard.getIPhoneModel().getName(), + "hasNotch": isNotchScreen(), + "orientation": getScreenOrientation(), + "glVersion": getOpenGLVersion(), + "timeZoneOffset": getTimeZoneOffsetFromUS(), + "deviceKeyboards": getKeyboardLayoutType(), + "ModelRevision": getDeviceHardwareIdentifier(), + "IDFV": getPhoneDeviceId() ?? "", + ] + } + + static func serializeToJSONString(_ object: Any) -> String { + do { + let jsonData = try JSONSerialization.data(withJSONObject: object, options: []) + return String(data: jsonData, encoding: .utf8) ?? "{}" + } catch { + print("Error serializing object to JSON string: \(error.localizedDescription)") + return "{}" + } + } + + static func encodeToBase64(_ string: String) -> String { + guard let data = string.data(using: .utf8) else { return "" } + return data.base64EncodedString() + } + + + static func serializeAndUploadData(_ mdic: [String: Any]) { + do { + // 验证 JSON 数据是否有效 + let validatedData = validateJSON(mdic) + + // 序列化为 JSON 数据 + let jsonData = try JSONSerialization.data(withJSONObject: validatedData, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + print("save_iphone_logs with data: \(jsonString)") + + + + // 上传网络请求 + YL_NetWorkManager.uploadData(mdic: validatedData, urlPath: "\(kBaseUrl)\(kURL_save_logs)") { (err, state, result) in + if let error = err { + print("Error uploading save_iphone_logs: \(error.localizedDescription)") + } else { + print("save_iphone_logs response: \(result ?? [:])") + } + } + } catch { + print("Error serializing JSON save_iphone_logs: \(error.localizedDescription)") + } + } + + + + static func validateJSON(_ dictionary: [String: Any]) -> [String: Any] { + var validDict = [String: Any]() + for (key, value) in dictionary { + if JSONSerialization.isValidJSONObject([key: value]) { + validDict[key] = value + } else { + print("Invalid JSON value for key \(key): \(value)") + validDict[key] = "\(value)" // 将不支持的值转换为字符串 + } + } + return validDict + } + +} + + + +extension String { + func aesEncrypt(key: String, iv: String) -> String? { + guard let data = self.data(using: .utf8), + let encryptedData = data.aesEncrypt(key: key, iv: iv) else { return nil } + return encryptedData.base64EncodedString() + } + + func aesDecrypt(key: String, iv: String) -> String? { + guard let data = Data(base64Encoded: self), + let decryptedData = data.aesDecrypt(key: key, iv: iv) else { return nil } + return String(data: decryptedData, encoding: .utf8) + } +} + +extension Data { + func aesEncrypt(key: String, iv: String) -> Data? { + return self.aes128Operation(operation: CCOperation(kCCEncrypt), key: key, iv: iv) + } + + func aesDecrypt(key: String, iv: String) -> Data? { + return self.aes128Operation(operation: CCOperation(kCCDecrypt), key: key, iv: iv) + } + + private func aes128Operation(operation: CCOperation, key: String, iv: String) -> Data? { + guard key.count == kCCKeySizeAES128, iv.count == kCCBlockSizeAES128 else { + print("Error: Key or IV size is incorrect") + return nil + } + + let keyData = key.data(using: .utf8)! + let ivData = iv.data(using: .utf8)! + var outLength = Int(0) + var outBytes = [UInt8](repeating: 0, count: self.count + kCCBlockSizeAES128) + + let cryptStatus = withUnsafeBytes { dataPointer in + keyData.withUnsafeBytes { keyPointer in + ivData.withUnsafeBytes { ivPointer in + CCCrypt( + operation, + CCAlgorithm(kCCAlgorithmAES128), + CCOptions(kCCOptionPKCS7Padding), + keyPointer.baseAddress, kCCKeySizeAES128, + ivPointer.baseAddress, + dataPointer.baseAddress, self.count, + &outBytes, outBytes.count, + &outLength + ) + } + } + } + + guard cryptStatus == kCCSuccess else { + print("Error: AES operation failed with status \(cryptStatus)") + return nil + } + + return Data(bytes: outBytes, count: outLength) + } +} + + + + diff --git a/max/template/playbtest/playbtest/PlayB/YL_PlayVC.swift b/max/template/playbtest/playbtest/PlayB/YL_PlayVC.swift new file mode 100644 index 0000000..55019b5 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/YL_PlayVC.swift @@ -0,0 +1,158 @@ +// +// YL_PlayVC.swift +// playbtest +// +// Created by 忆海16 on 2024/11/5. +// + +import UIKit + +class YL_PlayVC: UIViewController,UITextViewDelegate { + + + @IBOutlet weak var textSDKView: UITextView! + + @IBOutlet weak var bundleIdLab: UILabel! + + @IBOutlet weak var deviceIdLab: UILabel! + + @IBOutlet weak var idfaLab: UILabel! + + @IBOutlet weak var ipLab: UILabel! + + @IBOutlet weak var ad1Lab: UILabel! + + @IBOutlet weak var ad2Lab: UILabel! + + @IBOutlet weak var ad3Lab: UILabel! + + private var observation: NSKeyValueObservation? + + private var observationis: NSKeyValueObservation? + + var openADTimer:Timer? + let kOpenADPerSec: CGFloat = 0.1 // 假设的秒数 + let kOpenAdCTimeLength: CGFloat = 30 // 假设的超时时长 + + static var totalTimeC: CGFloat = 0.0 + + + + override func viewDidLoad() { + super.viewDidLoad() + BbbAdManager.shared.loadAd() + let bundleId = Bundle.main.bundleIdentifier ?? "" + bundleIdLab.text = "Name:\(bundleId)" + let deviceId = BbbAdManager.config.adbrush_deviceid ?? "" + deviceIdLab.text = "DeviceID:\(deviceId)" + let locIp = BbbAdManager.config.adbrush_localip ?? "" + let remoteIp = BbbAdManager.config.remouteIP + ipLab.text = "LocIP:\(locIp),RemoteIp:\(remoteIp)" + + if #available(iOS 14, *) { + IDFA.shared.checkATT { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + self.idfaLab.text = "IDFA:\(idfa)" + } else { + print("无法获取 IDFA") + } + } + } else { + IDFA.shared.getIDFAForOlderVersions { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + self.idfaLab.text = "IDFA:\(idfa)" + } else { + print("无法获取 IDFA") + } + } + } + + + // 确保计时器被正确添加到 RunLoop + /* + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.saveIphonelogs() + } + */ + + textSDKView.delegate = self + + } + + + + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + ad1Lab.text = BbbAdManager.config.adids[0] + ad2Lab.text = BbbAdManager.config.adids[1] + ad3Lab.text = BbbAdManager.config.adids[2] + + + self.navigationController?.navigationBar.isHidden = true + + NotificationCenter.default.addObserver(self, selector: #selector(addTextToTextView), name: NSNotification.Name("adinfo"), object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(adStatusChange), name: NSNotification.Name("adStatus"), object: nil) + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "adbrush_base_url:\(BbbAdManager.config.adbrush_base_url),adbrush_deviceid:\(String(describing: BbbAdManager.config.adbrush_deviceid)),adbrush_localip:\(String(describing: BbbAdManager.config.adbrush_localip)),adbrush_local_url:\(BbbAdManager.config.adbrush_local_url),adbrush_ecpm:\(BbbAdManager.config.adbrush_ecpm)"]) + + + } + + + + + + // 向文本末尾追加 100 行空白行 + func appendExtraLines1() { + let extraLines = String(repeating: "\n", count: 100) + let currentText = textSDKView.text ?? "" + + // 检查末尾是否已经有额外行,避免重复追加 + if !currentText.hasSuffix(extraLines) { + textSDKView.text = currentText.trimmingCharacters(in: .whitespacesAndNewlines) + extraLines + } + } + + + + @objc func addTextToTextView(notification: Notification) { + if let newText = notification.userInfo?["text"] as? String { + textSDKView.text.append("\(newText)\n\n") + } + } + + + + @objc func adStatusChange(notification: Notification) { + if let newText = notification.userInfo?["text"] as? String, let id = notification.userInfo?["id"] as? String { + var lab = ad1Lab + if id == BbbAdManager.config.adids[1] { + lab = ad2Lab + } else if id == BbbAdManager.config.adids[2] { + lab = ad3Lab + } + lab?.text = "\(id):\(newText)" + } + } + + + + + + + + deinit { + + NotificationCenter.default.removeObserver(self) + + } + +} diff --git a/max/template/playbtest/playbtest/PlayB/YL_PlayVC.xib b/max/template/playbtest/playbtest/PlayB/YL_PlayVC.xib new file mode 100644 index 0000000..20a921b --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/YL_PlayVC.xib @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/max/template/playbtest/playbtest/PlayB/bbbAdManager.swift b/max/template/playbtest/playbtest/PlayB/bbbAdManager.swift new file mode 100644 index 0000000..527f4c5 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/bbbAdManager.swift @@ -0,0 +1,399 @@ +// +// bbbAdManager.swift +// playbtest +// +// Created by mac on 2025/3/11. +// + +import Foundation +import AppLovinSDK + + +class bConfig: NSObject { + /// 广告Key + var adKey:String = "{adKey}" + + /// 广告数组 + var allAdIds:[String] = [{allAdIds}] + /// 广告数组 + var adids:[String] = [] + ///设备ID + var adbrush_deviceid:String? + ///最低ecpm + var adbrush_ecpm:Double = 0.0005 + /// 本地ip + var adbrush_localip:String? + /// A面load show + var adbrush_base_url:String = "http://192.168.40.8:8080" + /// 本地服务 + var adbrush_local_url:String = "http://127.0.0.1:6000" + + /// 远程ip + var remouteIP:String = "" + /// dataId + var dataId:String = "" + + ///IDFA + var idfa:String = "" + + + + /// + var washParam:Bool = false + /// + var linkId:String = "" + + ///load次数 + var loadcount:Int = 0 + + var ipTime:Int = 0 + + override init() { + super.init() + if self.allAdIds.count > 3 { + self.adids = Array(self.allAdIds.shuffled().prefix(3)) + } else { + self.adids = self.allAdIds + } + } + + ///是否正在展示中 + @objc dynamic var isadsureshow:Bool = false + + + func getRandomString() -> String? { + return adids.randomElement() + } + // 判断当前是否为广告不量模式 + func isADSSMode() -> Bool { + // return true + return UserDefaults.standard.bool(forKey: "kLuxSSFaceKey") + } +} + +class AdItem :NSObject,MAAdDelegate{ + + + var interstitialAd:MAInterstitialAd! + var interstitialAdID: String = "" + + var retryAttempt = 0.0 + + // 定义广告关闭后的操作闭包 + var onAdClosed: (() -> Void)? + var onStatusChange:((_:String,_:Int, _:Double) -> Void)? + + var startLoadTime: DispatchTime? + + // 0: 初始,1:加载中,2:加载完成,3:展示中,4:关闭,5:加载失败,6:展示失败 + private(set) var status: Int = 0 + + private(set) var ecpm:Double = 0.0 + + + init(adID:String){ + + super.init() + self.interstitialAdID = adID + // loadInterstitialAd() + + } + + func changeStatus(st:Int) { + self.status = st + onStatusChange?(self.interstitialAdID, st, self.ecpm) + } + + + func loadInterstitialAd(){ + interstitialAd = MAInterstitialAd(adUnitIdentifier:interstitialAdID) + interstitialAd.delegate = self + startLoadTime = DispatchTime.now() + changeStatus(st: 1) + NSLog("XS loadInterstitialAd\(self.interstitialAdID)") + interstitialAd.load() + NSLog("XS loadInterstitialAd 2 \(self.interstitialAdID)"); + + } + + + func showAd(onAdClosed: @escaping () -> Void) { + self.onAdClosed = onAdClosed + NSLog("onAdClosed set: \(self.onAdClosed != nil)") + interstitialAd.show(forPlacement: interstitialAdID) + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "---走到了show:\(interstitialAdID)"]) + } + + func didLoad(_ ad: MAAd) { + NSLog("XS didLoad\(self.interstitialAdID)") + BbbAdManager.config.loadcount += 1 + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载广告: \(ad.adUnitIdentifier) 成功"]) + retryAttempt = 0 // 重置重试次数 + NSLog("成功加载广告\(ad.adUnitIdentifier)") + self.ecpm = ad.revenue + + // 计算并打印加载时间 + var time = 0 + if let startTime = startLoadTime { + let loadDuration = calculateElapsedTime(since: startTime) + print("广告 \(ad.adUnitIdentifier) 加载时间: \(loadDuration) ms") + time = loadDuration + } + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Load(adid: ad.adUnitIdentifier, ecpm: ad.revenue, network: ad.networkName, countryCode: ALSdk.shared().configuration.countryCode, platformResponseTime:ad.requestLatency , dsp: ad.dspName ?? "", loadTime: time) + } + // 发布广告加载成功通知 + // NotificationCenter.default.post(name: .adDidLoad, object: nil, userInfo: ["adId": ad.adUnitIdentifier]) + changeStatus(st: 2) + } + + func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) { + NSLog("XS didFailToLoadAd 1 \(self.interstitialAdID)") + BbbAdManager.config.loadcount += 1 + NSLog("XS didFailToLoadAd 2 \(self.interstitialAdID) \(error)") + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载:\(adUnitIdentifier ) 失败"]) + NSLog("XS didFailToLoadAd 3 \(self.interstitialAdID)") + // NotificationCenter.default.post(name: .adDidFailToLoad, object: nil, userInfo: ["adId": adUnitIdentifier]) + + + NSLog("XS didFailToLoadAd 4 \(self.interstitialAdID)") + changeStatus(st: 5) + NSLog("XS didFailToLoadAd 5 \(self.interstitialAdID)") + } + + func didDisplay(_ ad: MAAd) { + + + print("成功展示了ad\(ad.adUnitIdentifier)") + // NotificationCenter.default.post(name: .adDidDisplay, object: nil, userInfo: ["adId": ad.adUnitIdentifier]) + + // let currentIDFV = UIDevice.current.identifierForVendor?.uuidString + + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + + YL_NetWorkManager.showAd(adId: ad.adUnitIdentifier, ecpm: ad.revenue, ad: true) + } + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Show(adid: ad.adUnitIdentifier, ecpm: ad.revenue, network: ad.networkName, countryCode: ALSdk.shared().configuration.countryCode, platformResponseTime:ad.requestLatency , dsp: ad.dspName ?? "") + } + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "成功展示了ad\(ad.adUnitIdentifier)"]) + + changeStatus(st: 3) + } + + func didHide(_ ad: MAAd) { + changeStatus(st: 4) + print("成功关闭广告\(ad.adUnitIdentifier)") + onAdClosed?() + } + + func didClick(_ ad: MAAd) { + print("点击了广告\(ad.adUnitIdentifier)") + } + + func didFail(toDisplay ad: MAAd, withError error: MAError) { + changeStatus(st: 6) + print("展示广告\(ad.adUnitIdentifier),\(error)失败") + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "展示广告\(ad.adUnitIdentifier),\(error)失败"]) + //self.onAdClosed!() + } + // 辅助函数以毫秒为单位计算经过的时间 + private func calculateElapsedTime(since startTime: DispatchTime) -> Int { + let endTime = DispatchTime.now() + let nanoseconds = endTime.uptimeNanoseconds - startTime.uptimeNanoseconds + return Int(nanoseconds / 1_000_000) // 转换为毫秒 + } + +} + + +class BbbAdManager: NSObject { + static let shared = BbbAdManager() + static let config = bConfig() + + ///是否正在展示中 + @objc dynamic var isshow:Bool = false + + // 用于存储多个广告位的管理器,Key 是广告位的 ID + private var adItems: [String: AdItem] = [:] + + var openADTimer:Timer? + let kOpenADPerSec: CGFloat = 0.1 // 假设的秒数 + let kOpenAdCTimeLength: CGFloat = 30 // 假设的超时时长 + + static var totalTimeC: CGFloat = 0.0 + + + // 添加广告位管理器 + func add(adId: String) { + let adManager = AdItem(adID: adId) + adManager.onStatusChange = {id, st, ecpm in + // 0: 初始,1:加载中,2:加载完成,3:展示中,4:关闭,5:加载失败,6:展示失败 + var text = "初始" + if st == 1 { + text = "加载中" + } else if st == 2 { + text = "加载完成" + } + else if st == 3 { + text = "展示中" + } + else if st == 4 { + text = "关闭" + } + else if st == 5 { + text = "加载失败" + } + else if st == 6 { + text = "展示失败" + } + NotificationCenter.default.post(name: NSNotification.Name("adStatus"), object: nil, userInfo: ["id": id, "text":"\(text),ecpm:\(ecpm)"]) + } + adItems[adId] = adManager + } + + override init(){ + + super.init() + if BbbAdManager.config.isADSSMode() { + self.initConfig() + } + + } + + func initConfig () { + if #available(iOS 14, *) { + IDFA.shared.checkATT { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + } else { + print("无法获取 IDFA") + } + } + } else { + IDFA.shared.getIDFAForOlderVersions { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + } else { + print("无法获取 IDFA") + } + } + } + if let bfaceDict = UserDefaults.standard.dictionary(forKey: "bfaceDictKey"){ + + BbbAdManager.config.adbrush_base_url = bfaceDict["adbrush_base_url"] as? String ?? "http://183.222.62.53:58078" + + BbbAdManager.config.adbrush_deviceid = bfaceDict["adbrush_deviceid"] as? String ?? "" + BbbAdManager.config.adbrush_localip = bfaceDict["adbrush_localip"] as? String ?? "" + BbbAdManager.config.remouteIP = bfaceDict["remouteIP"] as? String ?? "" + + + BbbAdManager.config.adbrush_local_url = bfaceDict["adbrush_local_url"] as? String ?? "http://127.0.0.1:6000" + BbbAdManager.config.dataId = bfaceDict["dataId"] as? String ?? "" + + + BbbAdManager.config.adbrush_ecpm = bfaceDict["adbrush_ecpm"] as? Double ?? 0.005 + BbbAdManager.config.linkId = bfaceDict["linkId"] as? String ?? "" + BbbAdManager.config.washParam = bfaceDict["washParam"] as? Bool ?? false + } else { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "获取字典失败"]) + } + } + + func initAd() { + let initConfig = ALSdkInitializationConfiguration(sdkKey: BbbAdManager.config.adKey) { builder in + + builder.mediationProvider = ALMediationProviderMAX + + // Perform any additional configuration/setting changes + + } + + ALSdk.shared().initialize(with: initConfig) { sdkConfig in + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "初始化广告成功"]) + // YL_NetWorkManager().requestRemoteIp() + BbbAdManager.shared.loadAd2() + DispatchQueue.main.asyncAfter(deadline: .now() + 4) { + BbbAdManager.shared.start() + } + } + } + func loadAd2() { + for(index,ad) in self.adItems.values.enumerated() { + ad.loadInterstitialAd() + } + } + func loadAd() { + if BbbAdManager.config.washParam == true{ + let adid = BbbAdManager.config.getRandomString() + BbbAdManager.shared.add(adId: adid ?? "") + }else{ + for (index, adId) in BbbAdManager.config.adids.enumerated() { + //DispatchQueue.main.asyncAfter(deadline: .now() + Double(index) * 1) { + BbbAdManager.shared.add(adId: adId) + //} + } + } + } + func start() { + guard openADTimer == nil else { return } + openADTimer = Timer.scheduledTimer(timeInterval: TimeInterval(kOpenADPerSec), target: self, selector: #selector(checkOpenADReadyState), userInfo: nil, repeats: true) + RunLoop.current.add(openADTimer!, forMode: .common) + } + func isEnd () -> Bool { + if(self.isshow) { + return false + } + for (_, ad) in BbbAdManager.shared.adItems { + if(ad.status <= 1) { + return false + } + if (ad.status == 2 && ad.ecpm >= BbbAdManager.config.adbrush_ecpm) { + return false + } + } + return true + } + func showAd() { + guard !self.isshow else { return } + for (_, ad) in BbbAdManager.shared.adItems { + if (ad.status == 2 && ad.ecpm >= BbbAdManager.config.adbrush_ecpm) { + ad.showAd { [weak self] in + NSLog("广告关闭") + guard let self = self else { return } + self.isshow = false + } + self.isshow = true + break + } + } + } + func closeAd(v:Int) { + closeAD.removeADVC(byDelayTime: v) + self.isshow = false + } + + @objc func checkOpenADReadyState(){ + BbbAdManager.totalTimeC += kOpenADPerSec + + if BbbAdManager.shared.isEnd() || BbbAdManager.totalTimeC >= kOpenAdCTimeLength { + openADTimer?.invalidate() + openADTimer = nil + YL_NetWorkManager.loadend(max_ecpm: 0) + } + + if BbbAdManager.shared.isshow == false{ + BbbAdManager.shared.showAd() + } + + } +} diff --git a/max/template/playbtest/playbtest/PlayB/closeAD.h b/max/template/playbtest/playbtest/PlayB/closeAD.h new file mode 100644 index 0000000..f7757b5 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/closeAD.h @@ -0,0 +1,19 @@ +// +// closeAD.h +// playbtest +// +// Created by 忆海16 on 2024/11/6. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + + + +@interface closeAD : NSObject ++ (void)removeADVCByDelayTime:(NSInteger)delayTime; +@end + + +NS_ASSUME_NONNULL_END diff --git a/max/template/playbtest/playbtest/PlayB/closeAD.m b/max/template/playbtest/playbtest/PlayB/closeAD.m new file mode 100644 index 0000000..47c6c2a --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/closeAD.m @@ -0,0 +1,141 @@ +// +// closeAD.m +// playbtest +// +// Created by 忆海16 on 2024/11/6. +// + +#import "closeAD.h" + +@implementation closeAD ++ (void)removeADVCByDelayTime:(NSInteger)delayTime { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime / 1000 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [closeAD removeVungleFullScreenPresenter]; + [closeAD closeADWindow]; + }); +} + +//+ (void)closeADWindow { +// NSLog(@"已经执行closeADWindow....."); +// UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; +// [keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { +// UIViewController *vc = obj.subviews.firstObject.nextResponder; +// if ([vc isKindOfClass:[NSClassFromString(@"ALAppLovinVideoViewController") class]]) { +// if ([vc respondsToSelector:@selector(skipVideo)]) { +// NSLog(@"执行了skipVideo....."); +// [vc performSelector:@selector(skipVideo) withObject:nil]; +// } +// if ([vc respondsToSelector:@selector(handleCloseButton)]) { +// NSLog(@"执行了handleCloseButton....."); +// [vc performSelector:@selector(handleCloseButton) withObject:nil]; +// } +// +// [closeAD checkCloseWindown]; +// +// } +// else if ([vc isKindOfClass:[NSClassFromString(@"ALVASTVideoViewController") class]]) { +// [vc performSelector:@selector(dismiss) withObject:nil]; +// +// [closeAD checkCloseWindown]; +// [closeAD removeVungleFullScreenPresenter]; +// } +// }]; +// +// +//} + ++ (void)closeADWindow { + NSLog(@"Executing closeADWindow - First Pass"); + [self performCloseADWindowActions]; + + NSLog(@"Executing closeADWindow - Second Pass"); + [self performCloseADWindowActions]; +} + ++ (void)performCloseADWindowActions { + UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; + if (!keyWindow) return; // Ensure keyWindow is non-nil + + [keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIViewController *vc = obj.subviews.firstObject.nextResponder; + if (!vc || ![vc isKindOfClass:[UIViewController class]]) return; // Check for non-nil vc + + if ([vc isKindOfClass:[NSClassFromString(@"ALAppLovinVideoViewController") class]]) { + if ([vc respondsToSelector:@selector(skipVideo)]) { + NSLog(@"Executing skipVideo..."); + [vc performSelector:@selector(skipVideo) withObject:nil]; + } + if ([vc respondsToSelector:@selector(handleCloseButton)]) { + NSLog(@"Executing handleCloseButton..."); + [vc performSelector:@selector(handleCloseButton) withObject:nil]; + } + +// [closeAD checkCloseWindown]; + [closeAD removeVungleFullScreenPresenter]; + + } else if ([vc isKindOfClass:[NSClassFromString(@"ALVASTVideoViewController") class]]) { + if ([vc respondsToSelector:@selector(dismiss)]) { + [vc performSelector:@selector(dismiss) withObject:nil]; + } + +// [closeAD checkCloseWindown]; + [closeAD removeVungleFullScreenPresenter]; + } + [closeAD removeVungleFullScreenPresenter]; + }]; +} + +//+ (void)checkCloseWindown { +// static NSInteger closeCounter = 0; +// if (closeCounter >= 2) { +// NSLog(@"Stopping recursive closeADWindow calls"); +// closeCounter = 0; +// return; +// } +// closeCounter++; + +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// [closeAD closeADWindow]; +// }); +//} + ++ (void)removeVungleFullScreenPresenter { + UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; + UIViewController *foundViewController = [self findFullScreenPresenterInViewController:keyWindow.rootViewController]; + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *config = [userDefaults dictionaryForKey:@"xyzshell_hooks_settings_hook"]; + if (foundViewController) { + NSLog(@"Found FullScreenPresenter instance: %@", foundViewController); + + // 关闭或移除 FullScreenPresenter + [foundViewController dismissViewControllerAnimated:YES completion:^{ + NSLog(@"FullScreenPresenter dismissed."); + }]; + } else { + NSLog(@"FullScreenPresenter not found."); + } +} + ++ (UIViewController *)findFullScreenPresenterInViewController:(UIViewController *)viewController { + if ([viewController isKindOfClass:NSClassFromString(@"VungleAdsSDK.FullScreenPresenter")]) { + return viewController; + } + + // 递归遍历所有子控制器 + for (UIViewController *childViewController in viewController.childViewControllers) { + UIViewController *foundViewController = [self findFullScreenPresenterInViewController:childViewController]; + if (foundViewController) { + return foundViewController; + } + } + + // 检查 presentedViewController + if (viewController.presentedViewController) { + return [self findFullScreenPresenterInViewController:viewController.presentedViewController]; + } + + return nil; +} + +@end + diff --git a/max/template/playbtest/playbtest/PlayB/closeWindows.swift b/max/template/playbtest/playbtest/PlayB/closeWindows.swift new file mode 100644 index 0000000..267e4d7 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/closeWindows.swift @@ -0,0 +1,78 @@ +// +// closeWindows.swift +// playbtest +// +// Created by 忆海16 on 2024/11/11. +// + +import Foundation +import UIKit + +class closeWindows { + + @objc static func removeADVCByDelayTime(_ delayTime: Int) { + DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(delayTime)) { +// CloseAD.removeVungleFullScreenPresenter() + closeWindows.closeADWindow() + } + } + + @objc static func closeADWindow() { + print("Executing closeADWindow - First Pass") + performCloseADWindowActions() + + print("Executing closeADWindow - Second Pass") +// performCloseADWindowActions() + } + + private static func performCloseADWindowActions() { + guard let keyWindow = UIApplication.shared.keyWindow else { return } + + keyWindow.subviews.forEach { view in + if let vc = view.subviews.first?.next as? UIViewController { + + if vc.isKind(of: NSClassFromString("ALAppLovinVideoViewController") ?? UIViewController.self) || + vc.isKind(of: NSClassFromString("ALVASTVideoViewController") ?? UIViewController.self) { + + print("Removing ad view from window...") + view.removeFromSuperview() // Remove the ad view directly from the window’s subviews + + } + } + closeWindows.removeVungleFullScreenPresenter() + } + + } + + private static func removeVungleFullScreenPresenter() { + guard let keyWindow = UIApplication.shared.keyWindow else { return } + if let foundView = findFullScreenPresenterInViewController(keyWindow.rootViewController) { + print("Found FullScreenPresenter instance: \(foundView)") + foundView.view.removeFromSuperview() + print("FullScreenPresenter view removed from superview.") + } else { + print("FullScreenPresenter not found.") + } + } + + private static func findFullScreenPresenterInViewController(_ viewController: UIViewController?) -> UIViewController? { + guard let viewController = viewController else { return nil } + + if viewController.isKind(of: NSClassFromString("VungleAdsSDK.FullScreenPresenter") ?? UIViewController.self) { + return viewController + } + + for childViewController in viewController.children { + if let foundVC = findFullScreenPresenterInViewController(childViewController) { + return foundVC + } + } + + if let presentedVC = viewController.presentedViewController { + return findFullScreenPresenterInViewController(presentedVC) + } + + return nil + } + +} diff --git a/max/template/playbtest/playbtest/PlayB/getIphone.swift b/max/template/playbtest/playbtest/PlayB/getIphone.swift new file mode 100644 index 0000000..157ad07 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/getIphone.swift @@ -0,0 +1,154 @@ +// +// getIphone.swift +// playbtest +// +// Created by 忆海16 on 2024/12/31. +// + +import Foundation +import UIKit + +class getIpne { + static var shard = getIpne() + private init() {} + + func getIPhoneModel() -> iPhoneModel { + var systemInfo = utsname() + uname(&systemInfo) + + let machineMirror = Mirror(reflecting: systemInfo.machine) + let identifier = machineMirror.children.reduce("") { identifier, element in + guard let value = element.value as? Int8, value != 0 else { return identifier } + return identifier + String(UnicodeScalar(UInt8(value))) + } + + switch identifier { + case "iPhone5,1", "iPhone5,2": return .iPhone5 + case "iPhone5,3", "iPhone5,4": return .iPhone5C + case "iPhone6,1", "iPhone6,2": return .iPhone5S + case "iPhone7.2": return .iPhone6 + case "iPhone7,1": return .iPhone6Plus + case "iPhone8,1": return .iPhone6s + case "iPhone8,2": return .iPhone6Plus + case "iPhone8,4": return .iPhoneSE1 + case "iPhone9,1", "iPhone9,3": return .iPhone7 + case "iPhone9,2", "iPhone9,4": return .iPhone7Plus + case "iPhone10,1", "iPhone10,4": return .iPhone8 + case "iPhone10,2", "iPhone10,5": return .iPhone8Plus + case "iPhone10,3", "iPhone10,6": return .iPhoneX + case "iPhone11,8": return .iPhoneXR + case "iPhone11,2": return .iPhoneXS + case "iPhone11,6", "iPhone11,4": return .iPhoneXSMax + case "iPhone12,1": return .iPhone11 + case "iPhone12,3": return .iPhone11Pro + case "iPhone12,5": return .iPhone11ProMax + case "iPhone12,8": return .iPhoneSE2 + case "iPhone13,1": return .iPhone12Mini + case "iPhone13,2": return .iPhone12 + case "iPhone13,3": return .iPhone12Pro + case "iPhone13,4": return .iPhone12ProMax + case "iPhone14,4": return .iPhone13Mini + case "iPhone14,5": return .iPhone13 + case "iPhone14,2": return .iPhone13Pro + case "iPhone14,3": return .iPhone13ProMax + case "iPhone14,6": return .iPhoneSE3 + case "iPhone14,7": return .iPhone14 + case "iPhone14,8": return .iPhone14Plus + case "iPhone15,2": return .iPhone14Pro + case "iPhone15,3": return .iPhone14ProMax + case "iPhone15,4": return .iPhone15 + case "iPhone15,5": return .iPhone15Plus + case "iPhone16,1": return .iPhone15Pro + case "iPhone16,2": return .iPhone15ProMax + case "i386": return .simulator + case "x86_64": return .simulator + default: return .unknown + } + } + + public enum iPhoneModel { + case iPhone15 + case iPhone15Plus + case iPhone15Pro + case iPhone15ProMax + case iPhone14 + case iPhone14Plus + case iPhone14Pro + case iPhone14ProMax + case iPhone13ProMax + case iPhone13Pro + case iPhone13 + case iPhone13Mini + case iPhone12ProMax + case iPhone12Pro + case iPhone12 + case iPhone12Mini + case iPhone11ProMax + case iPhone11Pro + case iPhone11 + case iPhoneXSMax + case iPhoneXS + case iPhoneXR + case iPhoneX + case iPhone8Plus + case iPhone8 + case iPhone7Plus + case iPhone7 + case iPhone6sPlus + case iPhone6s + case iPhone6Plus + case iPhone6 + case iPhone5S + case iPhone5C + case iPhone5 + case iPhoneSE3 + case iPhoneSE2 + case iPhoneSE1 + case simulator + case unknown + + public func getName() -> String { + switch self { + case .iPhone5: return "iPhone 5" + case .iPhone5C: return "iPhone 5C" + case .iPhone5S: return "iPhone 5S" + case .iPhone6: return "iPhone 6" + case .iPhone6Plus: return "iPhone 6 Plus" + case .iPhone6s: return "iPhone 6s" + case .iPhone6sPlus: return "iPhone 6s Plus" + case .iPhoneSE1: return "iPhone SE1" + case .iPhone7: return "iPhone 7" + case .iPhone7Plus: return "iPhone 7 Plus" + case .iPhone8: return "iPhone 8" + case .iPhone8Plus: return "iPhone 8 Plus" + case .iPhoneX: return "iPhone X" + case .iPhoneXR: return "iPhone XR" + case .iPhoneXS: return "iPhone XS" + case .iPhoneXSMax: return "iPhone XS Max" + case .iPhone11: return "iPhone 11" + case .iPhone11Pro: return "iPhone 11 Pro" + case .iPhone11ProMax: return "iPhone 11 Pro Max" + case .iPhoneSE2: return "iPhone SE2" + case .iPhone12Mini: return "iPhone 12 mini" + case .iPhone12: return "iPhone 12" + case .iPhone12Pro: return "iPhone 12 Pro" + case .iPhone12ProMax: return "iPhone 12 Pro Max" + case .iPhone13Mini: return "iPhone 13 mini" + case .iPhone13: return "iPhone 13" + case .iPhone13Pro: return "iPhone 13 Pro" + case .iPhone13ProMax: return "iPhone 13 Pro Max" + case .simulator: return "Simulator" + case .unknown: return "unknown" + case .iPhone14: return "iPhone 14" + case .iPhone14Plus: return "iPhone 14 Plus" + case .iPhone14Pro: return "iPhone 14 Pro" + case .iPhone14ProMax: return "iPhone 14 Pro Max" + case .iPhoneSE3: return "iPhone SE3" + case .iPhone15: return "iPhone 15" + case .iPhone15Plus: return "iPhone 15 Plus" + case .iPhone15Pro: return "iPhone 15 Pro" + case .iPhone15ProMax: return "iPhone 15 Pro Max" + } + } + } +} diff --git a/max/template/playbtest/playbtest/PlayB/idfa.swift b/max/template/playbtest/playbtest/PlayB/idfa.swift new file mode 100644 index 0000000..28e79f4 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/idfa.swift @@ -0,0 +1,95 @@ +// +// idfa.swift +// playbtest +// +// Created by 忆海16 on 2024/12/31. +// + +import Foundation +import AppTrackingTransparency +import AdSupport + +class IDFA { + static let shared = IDFA() + + /// 检查并请求 ATT 授权 + @available(iOS 14, *) + func checkATT(completion: @escaping (String?) -> Void) { + let status = ATTrackingManager.trackingAuthorizationStatus + switch status { + case .notDetermined: + // 请求授权 + ATTrackingManager.requestTrackingAuthorization { newStatus in + self.handleATTStatus(newStatus, completion: completion) + } + case .authorized, .denied, .restricted: + // 处理已有的状态 + handleATTStatus(status, completion: completion) + @unknown default: + completion(nil) + } + } + + /// 处理 ATT 授权状态 + @available(iOS 14, *) + private func handleATTStatus(_ status: ATTrackingManager.AuthorizationStatus, completion: @escaping (String?) -> Void) { + switch status { + case .authorized: + // 用户已授权,获取 IDFA + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + completion(idfa) +// starManager.shared.idfa = idfa + case .denied, .restricted: + // 用户拒绝或受限,返回 nil + print("用户拒绝授权或功能受限") + completion(nil) + case .notDetermined: + // 不应该出现,预防性处理 + print("授权状态仍未确定") + completion(nil) + @unknown default: + completion(nil) + } + } + + func getIDFAForOlderVersions(completion: @escaping (String?) -> Void) { + if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + completion(idfa) + } else { + print("广告跟踪受限") + completion(nil) + } + } +} + + + + + +//func requestIDFA(completion: @escaping (String?) -> Void) { +// if #available(iOS 14.5, *) { +// // 检查跟踪授权状态 +// ATTrackingManager.requestTrackingAuthorization { status in +// switch status { +// case .authorized: +// // 用户授权后,获取 IDFA +// let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString +// completion(idfa) +// case .denied, .restricted, .notDetermined: +// // 用户拒绝、限制或未决定时,IDFA 将不可用 +// completion(nil) +// @unknown default: +// completion(nil) +// } +// } +// } else { +// // 对于 iOS 14.4 及以下版本,直接获取 IDFA +// if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { +// let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString +// completion(idfa) +// } else { +// completion(nil) +// } +// } +//} diff --git a/max/template/playbtest/playbtest/PlayB/playb.pch b/max/template/playbtest/playbtest/PlayB/playb.pch new file mode 100644 index 0000000..87f0c0b --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/playb.pch @@ -0,0 +1,15 @@ +// +// playb.pch +// playbtest +// +// Created by 忆海16 on 2024/11/6. +// + +#ifndef playb_pch +#define playb_pch +#import "playbtest-Swift.h" + +// Include any system framework and library headers here that should be included in all compilation units. +// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. + +#endif /* playb_pch */ diff --git a/max/template/playbtest/playbtest/PlayB/playbtest-Bridging-Header.h b/max/template/playbtest/playbtest/PlayB/playbtest-Bridging-Header.h new file mode 100644 index 0000000..3e4dbd3 --- /dev/null +++ b/max/template/playbtest/playbtest/PlayB/playbtest-Bridging-Header.h @@ -0,0 +1,6 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "closeAD.h" +#import "XUDPClient.h" diff --git a/max/template/playbtest/playbtest/ViewController.swift b/max/template/playbtest/playbtest/ViewController.swift new file mode 100644 index 0000000..0babbc8 --- /dev/null +++ b/max/template/playbtest/playbtest/ViewController.swift @@ -0,0 +1,19 @@ +// +// ViewController.swift +// playbtest +// +// Created by 忆海16 on 2024/11/5. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/topon/build.py b/topon/build.py new file mode 100644 index 0000000..1d3541d --- /dev/null +++ b/topon/build.py @@ -0,0 +1,111 @@ +import subprocess +import json +import sys +import os + + +def build(ad_app_id, ad_key, ad_ids, app_display_name,app_bundle_id,app_version,app_icon): + cmd = """ + rm -rfv build + mkdir build + cp -rfv template/PlayBTopOn ./build/ + """ + + subprocess.call(cmd, shell=True) + # 创建编译目录复制模版到build目录 + + print("--------------------") + # 读取配置 + + + ### 复制icon + + cmd = f""" + cp -fv {app_icon} ./build/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/h687603756335b.png + """ + subprocess.call(cmd, shell=True) + + ## 修改ad信息 + print("修改ad信息") + code_path = './build/PlayBTopOn/PlayBTopOn/playB/bbbAdManager.swift' + with open(code_path, 'r') as f: + code = f.read() + code = code.replace("{appId}", ad_app_id) + code = code.replace("{adKey}", ad_key) + code = code.replace("{allAdIds}", '"' + "\",\"".join(ad_ids) + '"') + with open(code_path, 'w') as f: + f.write(code) + + print("修改项目信息") + prj_path = "./build/PlayBTopOn/PlayBTopOn.xcodeproj/project.pbxproj" + with open(prj_path, 'r') as f: + code = f.read() + code = code.replace("{DisplayName}", app_display_name) + code = code.replace("{BundleId}", app_bundle_id) + code = code.replace("{Version}", app_version) + with open(prj_path, 'w') as f: + f.write(code) + + print("\n开始编译\n") + cmd = """ + cd ./build/PlayBTopOn + xcodebuild clean build -workspace PlayBTopOn.xcworkspace -configuration Release -scheme PlayBTopOn -derivedDataPath "../Target" -destination "platform=iOS,id=00008110-000815AE1179801E" + cd ../../ + """ + subprocess.call(cmd, shell=True) + + + print("\n开始打包\n") + + cmd = """ + mkdir ./build/ipas + cp -rfv ./build/Target/Build/Products/Release-iphoneos/PlayBTopOn.app ./build/ipas/ + cp ./template/embedded.mobileprovision ./build/ipas/PlayBTopOn.app/embedded.mobileprovision + find "./build/ipas/PlayBTopOn.app" -name "*.framework" -exec codesign -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" {} \; + find "./build/ipas/PlayBTopOn.app" -name "*.dylib" -exec codesign -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" {} \; + + codesign --entitlements ./template/Filza.entitlements -f -s "iPhone Distribution: Shumei Luo (T23C6PFSKY)" ./build/ipas/PlayBTopOn.app + + mkdir ./build/ipas/Payload + mv ./build/ipas/PlayBTopOn.app ./build/ipas/Payload + cd ./build/ipas + zip -r playb-topon.ipa Payload/ + """ + + subprocess.call(cmd, shell=True) + + +if __name__ == '__main__': + + app_icon = "/Users/mac/codes/ios/empty_topon/ipas/lux/Tikr/appicon.png" + + if len(sys.argv) < 2: + ad_app_id = "h68b560a6957c8" + ad_key = "a540e4c6e557c1ed3f06b5394246c5a42" + ad_ids = ["n68b560e6e9866","n68b560e6b3b1f","n68b560e676221","n68b560e6181aa"] + + app_display_name = "WYMT Radar" + app_bundle_id = "com.wsi.WSIWeatherWYMT-Radar" + app_version = "5.17.706" + + + build(ad_app_id, ad_key, ad_ids, app_display_name, app_bundle_id, app_version, app_icon) + else: + json_path = sys.argv[1] + with open(json_path, 'r') as f: + config = json.loads(f.read()) + + print(config) + + ad_app_id = config["sdk_app_id"] + ad_key = config["sdk_key"] + ad_ids = config["ad_ids"] + app_display_name = config["app_name"] + app_bundle_id = config["app_pkg_name"] + app_version = config["app_ver"] + app_icon_tmp:str = config["app_icon"] + if not app_icon_tmp is None and app_icon_tmp.strip() != '': + app_icon = os.path.join(os.path.dirname(json_path), app_icon_tmp) + + build(ad_app_id, ad_key, ad_ids, app_display_name, app_bundle_id, app_version, app_icon) + diff --git a/topon/template/Filza.entitlements b/topon/template/Filza.entitlements new file mode 100644 index 0000000..09e8830 --- /dev/null +++ b/topon/template/Filza.entitlements @@ -0,0 +1,26 @@ + + + + + application-identifier + T23C6PFSKY.forecast.barometer.storm.radar.Weather10 + aps-environment + production + com.apple.developer.associated-domains + * + com.apple.developer.team-identifier + T23C6PFSKY + com.apple.security.application-groups + + group.forecast.barometer.storm.radar.Weather10.appshortcallid + group.forecast.barometer.storm.radar.Weather10.appcallid + + get-task-allow + + keychain-access-groups + + T23C6PFSKY.* + com.apple.token + + + \ No newline at end of file diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.pbxproj b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.pbxproj new file mode 100644 index 0000000..58b3c90 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.pbxproj @@ -0,0 +1,540 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 049B446F2DACAB6D0005EB66 /* GCDAsyncUdpSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 049B446A2DACAB6D0005EB66 /* GCDAsyncUdpSocket.m */; }; + 049B44702DACAB6D0005EB66 /* bbbAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049B446E2DACAB6D0005EB66 /* bbbAdManager.swift */; }; + 049B44712DACAB6D0005EB66 /* XUDPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 049B446D2DACAB6D0005EB66 /* XUDPClient.m */; }; + 755ADA202D2D25C600C9D994 /* getIphone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755ADA1E2D2D25C600C9D994 /* getIphone.swift */; }; + 755ADA212D2D25C600C9D994 /* idfa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755ADA1F2D2D25C600C9D994 /* idfa.swift */; }; + 75F8FFD12CE7233B008E8DF6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F8FFD02CE7233B008E8DF6 /* AppDelegate.swift */; }; + 75F8FFD52CE7233B008E8DF6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F8FFD42CE7233B008E8DF6 /* ViewController.swift */; }; + 75F8FFD82CE7233B008E8DF6 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 75F8FFD72CE7233B008E8DF6 /* Base */; }; + 75F8FFDA2CE72340008E8DF6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75F8FFD92CE72340008E8DF6 /* Assets.xcassets */; }; + 75F8FFDD2CE72340008E8DF6 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 75F8FFDC2CE72340008E8DF6 /* Base */; }; + 75F8FFE82CE723FF008E8DF6 /* YL_PlayVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 75F8FFE52CE723FE008E8DF6 /* YL_PlayVC.xib */; }; + 75F8FFE92CE723FF008E8DF6 /* YL_PlayVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F8FFE62CE723FF008E8DF6 /* YL_PlayVC.swift */; }; + 75F8FFF32CE72555008E8DF6 /* initializationTopOn.m in Sources */ = {isa = PBXBuildFile; fileRef = 75F8FFF12CE72555008E8DF6 /* initializationTopOn.m */; }; + 75F8FFF72CE72B7D008E8DF6 /* YL_NetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F8FFF62CE72B7D008E8DF6 /* YL_NetWorkManager.swift */; }; + 84921A6E873B758EF39EBDFA /* Pods_PlayBTopOn.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33A6D387585D55B3F340F5DB /* Pods_PlayBTopOn.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 049B44682DACAB6D0005EB66 /* CocoaAsyncSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CocoaAsyncSocket.h; sourceTree = ""; }; + 049B44692DACAB6D0005EB66 /* GCDAsyncUdpSocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCDAsyncUdpSocket.h; sourceTree = ""; }; + 049B446A2DACAB6D0005EB66 /* GCDAsyncUdpSocket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncUdpSocket.m; sourceTree = ""; }; + 049B446C2DACAB6D0005EB66 /* XUDPClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XUDPClient.h; sourceTree = ""; }; + 049B446D2DACAB6D0005EB66 /* XUDPClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XUDPClient.m; sourceTree = ""; }; + 049B446E2DACAB6D0005EB66 /* bbbAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = bbbAdManager.swift; sourceTree = ""; }; + 33A6D387585D55B3F340F5DB /* Pods_PlayBTopOn.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PlayBTopOn.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6297C68F5F2E4537B6CB3D1C /* Pods-PlayBTopOn.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PlayBTopOn.debug.xcconfig"; path = "Target Support Files/Pods-PlayBTopOn/Pods-PlayBTopOn.debug.xcconfig"; sourceTree = ""; }; + 755ADA1E2D2D25C600C9D994 /* getIphone.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = getIphone.swift; sourceTree = ""; }; + 755ADA1F2D2D25C600C9D994 /* idfa.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = idfa.swift; sourceTree = ""; }; + 75F8FFCD2CE7233B008E8DF6 /* PlayBTopOn.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PlayBTopOn.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 75F8FFD02CE7233B008E8DF6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75F8FFD42CE7233B008E8DF6 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 75F8FFD72CE7233B008E8DF6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 75F8FFD92CE72340008E8DF6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 75F8FFDC2CE72340008E8DF6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 75F8FFDE2CE72340008E8DF6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 75F8FFE52CE723FE008E8DF6 /* YL_PlayVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = YL_PlayVC.xib; sourceTree = ""; }; + 75F8FFE62CE723FF008E8DF6 /* YL_PlayVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YL_PlayVC.swift; sourceTree = ""; }; + 75F8FFEE2CE7250B008E8DF6 /* MyWallPaperHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyWallPaperHeader.h; sourceTree = ""; }; + 75F8FFEF2CE7250B008E8DF6 /* MyWallpaperPCH.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyWallpaperPCH.pch; sourceTree = ""; }; + 75F8FFF12CE72555008E8DF6 /* initializationTopOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = initializationTopOn.m; sourceTree = ""; }; + 75F8FFF22CE72555008E8DF6 /* initializationTopOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = initializationTopOn.h; sourceTree = ""; }; + 75F8FFF62CE72B7D008E8DF6 /* YL_NetWorkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YL_NetWorkManager.swift; sourceTree = ""; }; + B423D6A110C2422F79FE6615 /* Pods-PlayBTopOn.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PlayBTopOn.release.xcconfig"; path = "Target Support Files/Pods-PlayBTopOn/Pods-PlayBTopOn.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 75F8FFCA2CE7233B008E8DF6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 84921A6E873B758EF39EBDFA /* Pods_PlayBTopOn.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 049B446B2DACAB6D0005EB66 /* GCD */ = { + isa = PBXGroup; + children = ( + 049B44692DACAB6D0005EB66 /* GCDAsyncUdpSocket.h */, + 049B446A2DACAB6D0005EB66 /* GCDAsyncUdpSocket.m */, + ); + path = GCD; + sourceTree = ""; + }; + 75F8FFC42CE7233B008E8DF6 = { + isa = PBXGroup; + children = ( + 75F8FFCF2CE7233B008E8DF6 /* PlayBTopOn */, + 75F8FFCE2CE7233B008E8DF6 /* Products */, + CFE0CCAD1DCDC6DF946C8994 /* Pods */, + EC17E36934C0C7C23F86C29A /* Frameworks */, + ); + sourceTree = ""; + }; + 75F8FFCE2CE7233B008E8DF6 /* Products */ = { + isa = PBXGroup; + children = ( + 75F8FFCD2CE7233B008E8DF6 /* PlayBTopOn.app */, + ); + name = Products; + sourceTree = ""; + }; + 75F8FFCF2CE7233B008E8DF6 /* PlayBTopOn */ = { + isa = PBXGroup; + children = ( + 75F8FFF02CE7250B008E8DF6 /* Header */, + 75F8FFE42CE723E7008E8DF6 /* playB */, + 75F8FFD02CE7233B008E8DF6 /* AppDelegate.swift */, + 75F8FFD42CE7233B008E8DF6 /* ViewController.swift */, + 75F8FFD62CE7233B008E8DF6 /* Main.storyboard */, + 75F8FFD92CE72340008E8DF6 /* Assets.xcassets */, + 75F8FFDB2CE72340008E8DF6 /* LaunchScreen.storyboard */, + 75F8FFDE2CE72340008E8DF6 /* Info.plist */, + ); + path = PlayBTopOn; + sourceTree = ""; + }; + 75F8FFE42CE723E7008E8DF6 /* playB */ = { + isa = PBXGroup; + children = ( + 049B44682DACAB6D0005EB66 /* CocoaAsyncSocket.h */, + 049B446B2DACAB6D0005EB66 /* GCD */, + 049B446C2DACAB6D0005EB66 /* XUDPClient.h */, + 049B446D2DACAB6D0005EB66 /* XUDPClient.m */, + 049B446E2DACAB6D0005EB66 /* bbbAdManager.swift */, + 755ADA1E2D2D25C600C9D994 /* getIphone.swift */, + 755ADA1F2D2D25C600C9D994 /* idfa.swift */, + 75F8FFF62CE72B7D008E8DF6 /* YL_NetWorkManager.swift */, + 75F8FFF22CE72555008E8DF6 /* initializationTopOn.h */, + 75F8FFF12CE72555008E8DF6 /* initializationTopOn.m */, + 75F8FFE62CE723FF008E8DF6 /* YL_PlayVC.swift */, + 75F8FFE52CE723FE008E8DF6 /* YL_PlayVC.xib */, + ); + path = playB; + sourceTree = ""; + }; + 75F8FFF02CE7250B008E8DF6 /* Header */ = { + isa = PBXGroup; + children = ( + 75F8FFEE2CE7250B008E8DF6 /* MyWallPaperHeader.h */, + 75F8FFEF2CE7250B008E8DF6 /* MyWallpaperPCH.pch */, + ); + path = Header; + sourceTree = ""; + }; + CFE0CCAD1DCDC6DF946C8994 /* Pods */ = { + isa = PBXGroup; + children = ( + 6297C68F5F2E4537B6CB3D1C /* Pods-PlayBTopOn.debug.xcconfig */, + B423D6A110C2422F79FE6615 /* Pods-PlayBTopOn.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + EC17E36934C0C7C23F86C29A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 33A6D387585D55B3F340F5DB /* Pods_PlayBTopOn.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 75F8FFCC2CE7233B008E8DF6 /* PlayBTopOn */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75F8FFE12CE72340008E8DF6 /* Build configuration list for PBXNativeTarget "PlayBTopOn" */; + buildPhases = ( + 9FD2AE384D5FEDF5FF939DD1 /* [CP] Check Pods Manifest.lock */, + 75F8FFC92CE7233B008E8DF6 /* Sources */, + 75F8FFCA2CE7233B008E8DF6 /* Frameworks */, + 75F8FFCB2CE7233B008E8DF6 /* Resources */, + C0554906157B58199E7A6576 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PlayBTopOn; + productName = PlayBTopOn; + productReference = 75F8FFCD2CE7233B008E8DF6 /* PlayBTopOn.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 75F8FFC52CE7233B008E8DF6 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1530; + LastUpgradeCheck = 1530; + TargetAttributes = { + 75F8FFCC2CE7233B008E8DF6 = { + CreatedOnToolsVersion = 15.3; + }; + }; + }; + buildConfigurationList = 75F8FFC82CE7233B008E8DF6 /* Build configuration list for PBXProject "PlayBTopOn" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 75F8FFC42CE7233B008E8DF6; + productRefGroup = 75F8FFCE2CE7233B008E8DF6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 75F8FFCC2CE7233B008E8DF6 /* PlayBTopOn */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 75F8FFCB2CE7233B008E8DF6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75F8FFDA2CE72340008E8DF6 /* Assets.xcassets in Resources */, + 75F8FFE82CE723FF008E8DF6 /* YL_PlayVC.xib in Resources */, + 75F8FFDD2CE72340008E8DF6 /* Base in Resources */, + 75F8FFD82CE7233B008E8DF6 /* Base in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 9FD2AE384D5FEDF5FF939DD1 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-PlayBTopOn-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; + }; + C0554906157B58199E7A6576 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-PlayBTopOn/Pods-PlayBTopOn-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-PlayBTopOn/Pods-PlayBTopOn-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PlayBTopOn/Pods-PlayBTopOn-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 75F8FFC92CE7233B008E8DF6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75F8FFF72CE72B7D008E8DF6 /* YL_NetWorkManager.swift in Sources */, + 755ADA212D2D25C600C9D994 /* idfa.swift in Sources */, + 75F8FFF32CE72555008E8DF6 /* initializationTopOn.m in Sources */, + 049B446F2DACAB6D0005EB66 /* GCDAsyncUdpSocket.m in Sources */, + 049B44702DACAB6D0005EB66 /* bbbAdManager.swift in Sources */, + 049B44712DACAB6D0005EB66 /* XUDPClient.m in Sources */, + 75F8FFE92CE723FF008E8DF6 /* YL_PlayVC.swift in Sources */, + 75F8FFD52CE7233B008E8DF6 /* ViewController.swift in Sources */, + 755ADA202D2D25C600C9D994 /* getIphone.swift in Sources */, + 75F8FFD12CE7233B008E8DF6 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 75F8FFD62CE7233B008E8DF6 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 75F8FFD72CE7233B008E8DF6 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 75F8FFDB2CE72340008E8DF6 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 75F8FFDC2CE72340008E8DF6 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 75F8FFDF2CE72340008E8DF6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 17.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 75F8FFE02CE72340008E8DF6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 17.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 75F8FFE22CE72340008E8DF6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6297C68F5F2E4537B6CB3D1C /* Pods-PlayBTopOn.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 33FNMTSNA6; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "$(SRCROOT)/PlayBTopOn/Header/MyWallpaperPCH.pch"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PlayBTopOn/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "{DisplayName}"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = {Version}; + PRODUCT_BUNDLE_IDENTIFIER = {BundleId}; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = smart; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/PlayBTopOn/Header/MyWallPaperHeader.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 75F8FFE32CE72340008E8DF6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B423D6A110C2422F79FE6615 /* Pods-PlayBTopOn.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 33FNMTSNA6; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "$(SRCROOT)/PlayBTopOn/Header/MyWallpaperPCH.pch"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PlayBTopOn/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "{DisplayName}"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties."; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = {Version}; + PRODUCT_BUNDLE_IDENTIFIER = {BundleId}; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = smart; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/PlayBTopOn/Header/MyWallPaperHeader.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 75F8FFC82CE7233B008E8DF6 /* Build configuration list for PBXProject "PlayBTopOn" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75F8FFDF2CE72340008E8DF6 /* Debug */, + 75F8FFE02CE72340008E8DF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75F8FFE12CE72340008E8DF6 /* Build configuration list for PBXNativeTarget "PlayBTopOn" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75F8FFE22CE72340008E8DF6 /* Debug */, + 75F8FFE32CE72340008E8DF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 75F8FFC52CE7233B008E8DF6 /* Project object */; +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/project.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4088f3c6c3e811387fe9a8d6fd7d28a0fbf7840c GIT binary patch literal 10457 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 T27^AJRQNAS7ygGn6DR){B%C9o literal 0 HcmV?d00001 diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..8e2db6f --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + PlayBTopOn.xcscheme_^#shared#^_ + + orderHint + 11 + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..2547f56 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcodeproj/xcuserdata/yihai16.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + PlayBTopOn.xcscheme_^#shared#^_ + + orderHint + 8 + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/contents.xcworkspacedata b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ef1492d --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..3cb3c405131dd678201d65bab7cc353c86aee3d7 GIT binary patch literal 185629 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 + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..46623c1f6a3664ba6dfdd56cf089ed08deec52e7 GIT binary patch literal 61684 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 literal 0 HcmV?d00001 diff --git a/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..92c8596 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn.xcworkspace/xcuserdata/yihai16.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/AppDelegate.swift b/topon/template/PlayBTopOn/PlayBTopOn/AppDelegate.swift new file mode 100644 index 0000000..af5885f --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// PlayBTopOn +// +// Created by 忆海16 on 2024/11/15. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + static var shared: AppDelegate { + return UIApplication.shared.delegate as! AppDelegate + } + static let appid = UUID().uuidString + var window:UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + window = UIWindow() + window?.frame = UIScreen.main.bounds + NSLog("XS- app start:\(AppDelegate.appid)") + let vc = YL_PlayVC() + + window?.rootViewController = UINavigationController(rootViewController: vc) + + BbbAdManager.shared.initConfig() + + BbbAdManager.shared.initAd() + window?.makeKeyAndVisible() + return true + } + + func applicationWillEnterForeground(_ application: UIApplication) { + print("应用从后台进入前台") + BbbAdManager.shared.closeAd(v: 0); + + } + +} + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AccentColor.colorset/Contents.json b/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/Contents.json b/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..c35464c --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "h687603756335b.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/h687603756335b.png b/topon/template/PlayBTopOn/PlayBTopOn/Assets.xcassets/AppIcon.appiconset/h687603756335b.png new file mode 100644 index 0000000000000000000000000000000000000000..57b28e4ca4a9bb40856edc058f0b8f2f770f1b69 GIT binary patch literal 183029 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%0Dsr>5OlkgufjQY@6odKlQ@ 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≺`QX7=Uc(XrK77qi+*qY@&icDZI^$90El7- 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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Base.lproj/Main.storyboard b/topon/template/PlayBTopOn/PlayBTopOn/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallPaperHeader.h b/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallPaperHeader.h new file mode 100644 index 0000000..63e3167 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallPaperHeader.h @@ -0,0 +1,15 @@ +// +// MyWallPaperHeader.h +// Mywallpaper +// +// Created by 忆海16 on 2024/8/1. +// + +#ifndef MyWallPaperHeader_h +#define MyWallPaperHeader_h + +#import "initializationTopOn.h" +#import "XUDPClient.h" + + +#endif /* MyWallPaperHeader_h */ diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallpaperPCH.pch b/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallpaperPCH.pch new file mode 100644 index 0000000..eeea4e8 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Header/MyWallpaperPCH.pch @@ -0,0 +1,14 @@ +// +// MyWallpaperPCH.pch +// Mywallpaper +// +// Created by 忆海16 on 2024/8/1. +// +#import "PlayBTopOn-Swift.h" +#ifndef MyWallpaperPCH_pch +#define MyWallpaperPCH_pch + +// Include any system framework and library headers here that should be included in all compilation units. +// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. + +#endif /* MyWallpaperPCH_pch */ diff --git a/topon/template/PlayBTopOn/PlayBTopOn/Info.plist b/topon/template/PlayBTopOn/PlayBTopOn/Info.plist new file mode 100644 index 0000000..7feb523 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/Info.plist @@ -0,0 +1,555 @@ + + + + + LSApplicationQueriesSchemes + + ctrip + pinduoduo + openapp.jdmobile + taobao + imeituan + iosamap + alipay + baiduboxapp + vipshop + tmall + meituanwaimai + kwai + snssdk1128 + eleme + qunariphone + diditaxi + lianjiabeike + xhsdiscover + dianping + lianjia + ksnebula + sinaweibo + fleamarket + 1641486558 + id785385147 + id959841854 + id959841453 + id959840394 + id959841113 + id387682726 + id959841443 + 1094591345 + id1094591345 + id454434967 + id594457652 + id1182474649 + id1617391485 + id1567026344 + suning + baiduhaokan + bdminivideo + baiduboxlite + baiduboxmission + zhihu + wireless1688 + iqiyi + weixin + qihooloan + weishi + travelguide + wbmain + taobaotravel + alipays + youku + openjdlite + cainiao + kaola + OneTravel + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SKAdNetworkItems + + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + mls7yz5dvl.skadnetwork + + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + + SKAdNetworkIdentifier + cg4yq2srnc.skadnetwork + + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + + SKAdNetworkIdentifier + 737z793b9f.skadnetwork + + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + + SKAdNetworkIdentifier + 6xzpu9s2p8.skadnetwork + + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + + SKAdNetworkIdentifier + wg4vff78zm.skadnetwork + + + SKAdNetworkIdentifier + 523jb4fst2.skadnetwork + + + SKAdNetworkIdentifier + ggvn48r87g.skadnetwork + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + + SKAdNetworkIdentifier + 24t9a8vw3c.skadnetwork + + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + + SKAdNetworkIdentifier + prcb7njmu6.skadnetwork + + + SKAdNetworkIdentifier + m8dbw4sv7c.skadnetwork + + + SKAdNetworkIdentifier + 9nlqeag3gk.skadnetwork + + + SKAdNetworkIdentifier + cj5566h2ga.skadnetwork + + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + + SKAdNetworkIdentifier + w9q455wk68.skadnetwork + + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + + SKAdNetworkIdentifier + k674qkevps.skadnetwork + + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + + SKAdNetworkIdentifier + 5lm9lj6jb7.skadnetwork + + + SKAdNetworkIdentifier + 9rd848q2bz.skadnetwork + + + SKAdNetworkIdentifier + 7rz58n8ntl.skadnetwork + + + SKAdNetworkIdentifier + 4w7y6s5ca2.skadnetwork + + + SKAdNetworkIdentifier + feyaarzu9v.skadnetwork + + + SKAdNetworkIdentifier + ejvt5qm6ak.skadnetwork + + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + + SKAdNetworkIdentifier + n9x2a789qt.skadnetwork + + + SKAdNetworkIdentifier + 44jx6755aq.skadnetwork + + + SKAdNetworkIdentifier + zmvfpc5aq8.skadnetwork + + + SKAdNetworkIdentifier + tl55sbb4fm.skadnetwork + + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + + SKAdNetworkIdentifier + glqzh8vgby.skadnetwork + + + SKAdNetworkIdentifier + av6w8kgt66.skadnetwork + + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + + SKAdNetworkIdentifier + dzg6xy7pwj.skadnetwork + + + SKAdNetworkIdentifier + y45688jllp.skadnetwork + + + SKAdNetworkIdentifier + hdw39hrw9y.skadnetwork + + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + + SKAdNetworkIdentifier + 424m5254lk.skadnetwork + + + SKAdNetworkIdentifier + 5l3tpt7t6e.skadnetwork + + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + + SKAdNetworkIdentifier + mtkv5xtk9e.skadnetwork + + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + + SKAdNetworkIdentifier + 5tjdwbrq8w.skadnetwork + + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + + SKAdNetworkIdentifier + g28c52eehv.skadnetwork + + + SKAdNetworkIdentifier + su67r6k2v3.skadnetwork + + + SKAdNetworkIdentifier + rx5hdcabgc.skadnetwork + + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + + SKAdNetworkIdentifier + 32z4fx6l9h.skadnetwork + + + SKAdNetworkIdentifier + xy9t38ct57.skadnetwork + + + SKAdNetworkIdentifier + 54nzkqm89y.skadnetwork + + + SKAdNetworkIdentifier + 9b89h5y424.skadnetwork + + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + + SKAdNetworkIdentifier + 79pbpufp6p.skadnetwork + + + SKAdNetworkIdentifier + kbmxgpxpgc.skadnetwork + + + SKAdNetworkIdentifier + 275upjj5gd.skadnetwork + + + SKAdNetworkIdentifier + rvh3l7un93.skadnetwork + + + SKAdNetworkIdentifier + qqp299437r.skadnetwork + + + SKAdNetworkIdentifier + 294l99pt4k.skadnetwork + + + SKAdNetworkIdentifier + 74b6s63p6l.skadnetwork + + + SKAdNetworkIdentifier + 44n7hlldy6.skadnetwork + + + SKAdNetworkIdentifier + 6p4ks3rnbw.skadnetwork + + + SKAdNetworkIdentifier + f73kdq92p3.skadnetwork + + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + + SKAdNetworkIdentifier + 97r2b46745.skadnetwork + + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + + SKAdNetworkIdentifier + b9bk5wbcq9.skadnetwork + + + SKAdNetworkIdentifier + 84993kbrcf.skadnetwork + + + SKAdNetworkIdentifier + 24zw6aqk47.skadnetwork + + + SKAdNetworkIdentifier + pwdxu55a5a.skadnetwork + + + SKAdNetworkIdentifier + cs644xg564.skadnetwork + + + SKAdNetworkIdentifier + 6964rsfnh4.skadnetwork + + + SKAdNetworkIdentifier + 9vvzujtq5s.skadnetwork + + + SKAdNetworkIdentifier + a7xqa6mtl2.skadnetwork + + + SKAdNetworkIdentifier + r45fhb6rf7.skadnetwork + + + SKAdNetworkIdentifier + c3frkrj4fj.skadnetwork + + + SKAdNetworkIdentifier + 6g9af3uyq4.skadnetwork + + + SKAdNetworkIdentifier + u679fj5vs4.skadnetwork + + + SKAdNetworkIdentifier + g2y4y55b64.skadnetwork + + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + SKAdNetworkIdentifier + a8cz6cu7e5.skadnetwork + + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + + SKAdNetworkIdentifier + dbu4b84rxf.skadnetwork + + + SKAdNetworkIdentifier + mj797d8u6f.skadnetwork + + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + + SKAdNetworkIdentifier + ns5j362hk7.skadnetwork + + + SKAdNetworkIdentifier + mqn7fxpca7.skadnetwork + + + SKAdNetworkIdentifier + 252b5q8x7y.skadnetwork + + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + + SKAdNetworkIdentifier + 6yxyv74ff7.skadnetwork + + + SKAdNetworkIdentifier + 7fmhfwg9en.skadnetwork + + + SKAdNetworkIdentifier + cwn433xbcr.skadnetwork + + + SKAdNetworkIdentifier + f7s53z58qe.skadnetwork + + + SKAdNetworkIdentifier + vhf287vqwu.skadnetwork + + + SKAdNetworkIdentifier + x44k69ngh6.skadnetwork + + + SKAdNetworkIdentifier + mp6xlyr22a.skadnetwork + + + SKAdNetworkIdentifier + 7953jerfzd.skadnetwork + + + SKAdNetworkIdentifier + qu637u8glc.skadnetwork + + + SKAdNetworkIdentifier + 9yg77x724h.skadnetwork + + + SKAdNetworkIdentifier + n66cz3y3bx.skadnetwork + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/ViewController.swift b/topon/template/PlayBTopOn/PlayBTopOn/ViewController.swift new file mode 100644 index 0000000..cd3bbe9 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/ViewController.swift @@ -0,0 +1,19 @@ +// +// ViewController.swift +// PlayBTopOn +// +// Created by 忆海16 on 2024/11/15. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/CocoaAsyncSocket.h b/topon/template/PlayBTopOn/PlayBTopOn/playB/CocoaAsyncSocket.h new file mode 100755 index 0000000..b7ac3b3 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/CocoaAsyncSocket.h @@ -0,0 +1,19 @@ +// +// CocoaAsyncSocket.h +// CocoaAsyncSocket +// +// Created by Derek Clarkson on 10/08/2015. +// CocoaAsyncSocket project is in the public domain. +// + +#import + +//! Project version number for CocoaAsyncSocket. +FOUNDATION_EXPORT double cocoaAsyncSocketVersionNumber; + +//! Project version string for CocoaAsyncSocket. +FOUNDATION_EXPORT const unsigned char cocoaAsyncSocketVersionString[]; + + +#import "GCD/GCDAsyncUdpSocket.h" + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.h b/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.h new file mode 100755 index 0000000..af327e0 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.h @@ -0,0 +1,1036 @@ +// +// GCDAsyncUdpSocket +// +// This class is in the public domain. +// Originally created by Robbie Hanson of Deusty LLC. +// Updated and maintained by Deusty LLC and the Apple development community. +// +// https://github.com/robbiehanson/CocoaAsyncSocket +// + +#import +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN +extern NSString *const GCDAsyncUdpSocketException; +extern NSString *const GCDAsyncUdpSocketErrorDomain; + +extern NSString *const GCDAsyncUdpSocketQueueName; +extern NSString *const GCDAsyncUdpSocketThreadName; + +typedef NS_ERROR_ENUM(GCDAsyncUdpSocketErrorDomain, GCDAsyncUdpSocketError) { + GCDAsyncUdpSocketNoError = 0, // Never used + GCDAsyncUdpSocketBadConfigError, // Invalid configuration + GCDAsyncUdpSocketBadParamError, // Invalid parameter was passed + GCDAsyncUdpSocketSendTimeoutError, // A send operation timed out + GCDAsyncUdpSocketClosedError, // The socket was closed + GCDAsyncUdpSocketOtherError, // Description provided in userInfo +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@class GCDAsyncUdpSocket; + +@protocol GCDAsyncUdpSocketDelegate +@optional + +/** + * By design, UDP is a connectionless protocol, and connecting is not needed. + * However, you may optionally choose to connect to a particular host for reasons + * outlined in the documentation for the various connect methods listed above. + * + * This method is called if one of the connect methods are invoked, and the connection is successful. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address; + +/** + * By design, UDP is a connectionless protocol, and connecting is not needed. + * However, you may optionally choose to connect to a particular host for reasons + * outlined in the documentation for the various connect methods listed above. + * + * This method is called if one of the connect methods are invoked, and the connection fails. + * This may happen, for example, if a domain name is given for the host and the domain name is unable to be resolved. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error; + +/** + * Called when the datagram with the given tag has been sent. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag; + +/** + * Called if an error occurs while trying to send a datagram. + * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error; + +/** + * Called when the socket has received the requested datagram. +**/ +- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data + fromAddress:(NSData *)address + withFilterContext:(nullable id)filterContext; + +/** + * Called when the socket is closed. +**/ +- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError * _Nullable)error; + +@end + +/** + * You may optionally set a receive filter for the socket. + * A filter can provide several useful features: + * + * 1. Many times udp packets need to be parsed. + * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. + * The end result is a parallel socket io, datagram parsing, and packet processing. + * + * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. + * The filter can prevent such packets from arriving at the delegate. + * And because the filter can run in its own independent queue, this doesn't slow down the delegate. + * + * - Since the udp protocol does not guarantee delivery, udp packets may be lost. + * Many protocols built atop udp thus provide various resend/re-request algorithms. + * This sometimes results in duplicate packets arriving. + * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. + * + * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. + * Such packets need to be ignored. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * @param data - The packet that was received. + * @param address - The address the data was received from. + * See utilities section for methods to extract info from address. + * @param context - Out parameter you may optionally set, which will then be passed to the delegate method. + * For example, filter block can parse the data and then, + * pass the parsed data to the delegate. + * + * @returns - YES if the received packet should be passed onto the delegate. + * NO if the received packet should be discarded, and not reported to the delegete. + * + * Example: + * + * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { + * + * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; + * + * *context = response; + * return (response != nil); + * }; + * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; + * +**/ +typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *address, id __nullable * __nonnull context); + +/** + * You may optionally set a send filter for the socket. + * A filter can provide several interesting possibilities: + * + * 1. Optional caching of resolved addresses for domain names. + * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. + * + * 2. Reusable modules of code for bandwidth monitoring. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * @param data - The packet that was received. + * @param address - The address the data was received from. + * See utilities section for methods to extract info from address. + * @param tag - The tag that was passed in the send method. + * + * @returns - YES if the packet should actually be sent over the socket. + * NO if the packet should be silently dropped (not sent over the socket). + * + * Regardless of the return value, the delegate will be informed that the packet was successfully sent. + * +**/ +typedef BOOL (^GCDAsyncUdpSocketSendFilterBlock)(NSData *data, NSData *address, long tag); + + +@interface GCDAsyncUdpSocket : NSObject + +/** + * GCDAsyncUdpSocket uses the standard delegate paradigm, + * but executes all delegate callbacks on a given delegate dispatch queue. + * This allows for maximum concurrency, while at the same time providing easy thread safety. + * + * You MUST set a delegate AND delegate dispatch queue before attempting to + * use the socket, or you will get an error. + * + * The socket queue is optional. + * If you pass NULL, GCDAsyncSocket will automatically create its own socket queue. + * If you choose to provide a socket queue, the socket queue must not be a concurrent queue, + * then please see the discussion for the method markSocketQueueTargetQueue. + * + * The delegate queue and socket queue can optionally be the same. +**/ +- (instancetype)init; +- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; +- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; +- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; + +#pragma mark Configuration + +- (nullable id)delegate; +- (void)setDelegate:(nullable id)delegate; +- (void)synchronouslySetDelegate:(nullable id)delegate; + +- (nullable dispatch_queue_t)delegateQueue; +- (void)setDelegateQueue:(nullable dispatch_queue_t)delegateQueue; +- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; + +- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; +- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; +- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; + +/** + * By default, both IPv4 and IPv6 are enabled. + * + * This means GCDAsyncUdpSocket automatically supports both protocols, + * and can send to IPv4 or IPv6 addresses, + * as well as receive over IPv4 and IPv6. + * + * For operations that require DNS resolution, GCDAsyncUdpSocket supports both IPv4 and IPv6. + * If a DNS lookup returns only IPv4 results, GCDAsyncUdpSocket will automatically use IPv4. + * If a DNS lookup returns only IPv6 results, GCDAsyncUdpSocket will automatically use IPv6. + * If a DNS lookup returns both IPv4 and IPv6 results, then the protocol used depends on the configured preference. + * If IPv4 is preferred, then IPv4 is used. + * If IPv6 is preferred, then IPv6 is used. + * If neutral, then the first IP version in the resolved array will be used. + * + * Starting with Mac OS X 10.7 Lion and iOS 5, the default IP preference is neutral. + * On prior systems the default IP preference is IPv4. + **/ +- (BOOL)isIPv4Enabled; +- (void)setIPv4Enabled:(BOOL)flag; + +- (BOOL)isIPv6Enabled; +- (void)setIPv6Enabled:(BOOL)flag; + +- (BOOL)isIPv4Preferred; +- (BOOL)isIPv6Preferred; +- (BOOL)isIPVersionNeutral; + +- (void)setPreferIPv4; +- (void)setPreferIPv6; +- (void)setIPVersionNeutral; + +/** + * Gets/Sets the maximum size of the buffer that will be allocated for receive operations. + * The default maximum size is 65535 bytes. + * + * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. + * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. + * + * Since the OS/GCD notifies us of the size of each received UDP packet, + * the actual allocated buffer size for each packet is exact. + * And in practice the size of UDP packets is generally much smaller than the max. + * Indeed most protocols will send and receive packets of only a few bytes, + * or will set a limit on the size of packets to prevent fragmentation in the IP layer. + * + * If you set the buffer size too small, the sockets API in the OS will silently discard + * any extra data, and you will not be notified of the error. +**/ +- (uint16_t)maxReceiveIPv4BufferSize; +- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max; + +- (uint32_t)maxReceiveIPv6BufferSize; +- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max; + +/** + * Gets/Sets the maximum size of the buffer that will be allocated for send operations. + * The default maximum size is 65535 bytes. + * + * Given that a typical link MTU is 1500 bytes, a large UDP datagram will have to be + * fragmented, and that’s both expensive and risky (if one fragment goes missing, the + * entire datagram is lost). You are much better off sending a large number of smaller + * UDP datagrams, preferably using a path MTU algorithm to avoid fragmentation. + * + * You must set it before the sockt is created otherwise it won't work. + * + **/ +- (uint16_t)maxSendBufferSize; +- (void)setMaxSendBufferSize:(uint16_t)max; + +/** + * User data allows you to associate arbitrary information with the socket. + * This data is not used internally in any way. +**/ +- (nullable id)userData; +- (void)setUserData:(nullable id)arbitraryUserData; + +#pragma mark Diagnostics + +/** + * Returns the local address info for the socket. + * + * The localAddress method returns a sockaddr structure wrapped in a NSData object. + * The localHost method returns the human readable IP address as a string. + * + * Note: Address info may not be available until after the socket has been binded, connected + * or until after data has been sent. +**/ +- (nullable NSData *)localAddress; +- (nullable NSString *)localHost; +- (uint16_t)localPort; + +- (nullable NSData *)localAddress_IPv4; +- (nullable NSString *)localHost_IPv4; +- (uint16_t)localPort_IPv4; + +- (nullable NSData *)localAddress_IPv6; +- (nullable NSString *)localHost_IPv6; +- (uint16_t)localPort_IPv6; + +/** + * Returns the remote address info for the socket. + * + * The connectedAddress method returns a sockaddr structure wrapped in a NSData object. + * The connectedHost method returns the human readable IP address as a string. + * + * Note: Since UDP is connectionless by design, connected address info + * will not be available unless the socket is explicitly connected to a remote host/port. + * If the socket is not connected, these methods will return nil / 0. +**/ +- (nullable NSData *)connectedAddress; +- (nullable NSString *)connectedHost; +- (uint16_t)connectedPort; + +/** + * Returns whether or not this socket has been connected to a single host. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * If connected, the socket will only be able to send/receive data to/from the connected host. +**/ +- (BOOL)isConnected; + +/** + * Returns whether or not this socket has been closed. + * The only way a socket can be closed is if you explicitly call one of the close methods. +**/ +- (BOOL)isClosed; + +/** + * Returns whether or not this socket is IPv4. + * + * By default this will be true, unless: + * - IPv4 is disabled (via setIPv4Enabled:) + * - The socket is explicitly bound to an IPv6 address + * - The socket is connected to an IPv6 address +**/ +- (BOOL)isIPv4; + +/** + * Returns whether or not this socket is IPv6. + * + * By default this will be true, unless: + * - IPv6 is disabled (via setIPv6Enabled:) + * - The socket is explicitly bound to an IPv4 address + * _ The socket is connected to an IPv4 address + * + * This method will also return false on platforms that do not support IPv6. + * Note: The iPhone does not currently support IPv6. +**/ +- (BOOL)isIPv6; + +#pragma mark Binding + +/** + * Binds the UDP socket to the given port. + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You may optionally pass a port number of zero to immediately bind the socket, + * yet still allow the OS to automatically assign an available port. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr; + +/** + * Binds the UDP socket to the given port and optional interface. + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You may optionally pass a port number of zero to immediately bind the socket, + * yet still allow the OS to automatically assign an available port. + * + * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). + * You may also use the special strings "localhost" or "loopback" to specify that + * the socket only accept packets from the local machine. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToPort:(uint16_t)port interface:(nullable NSString *)interface error:(NSError **)errPtr; + +/** + * Binds the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. + * + * If you have an existing struct sockaddr you can convert it to a NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; + * + * Binding should be done for server sockets that receive data prior to sending it. + * Client sockets can skip binding, + * as the OS will automatically assign the socket an available port when it starts sending data. + * + * You cannot bind a socket after its been connected. + * You can only bind a socket once. + * You can still connect a socket (if desired) after binding. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. +**/ +- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr; + +#pragma mark Connecting + +/** + * Connects the UDP socket to the given host and port. + * By design, UDP is a connectionless protocol, and connecting is not needed. + * + * Choosing to connect to a specific host/port has the following effect: + * - You will only be able to send data to the connected host/port. + * - You will only be able to receive data from the connected host/port. + * - You will receive ICMP messages that come from the connected host/port, such as "connection refused". + * + * The actual process of connecting a UDP socket does not result in any communication on the socket. + * It simply changes the internal state of the socket. + * + * You cannot bind a socket after it has been connected. + * You can only connect a socket once. + * + * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). + * + * This method is asynchronous as it requires a DNS lookup to resolve the given host name. + * If an obvious error is detected, this method immediately returns NO and sets errPtr. + * If you don't care about the error, you can pass nil for errPtr. + * Otherwise, this method returns YES and begins the asynchronous connection process. + * The result of the asynchronous connection process will be reported via the delegate methods. + **/ +- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; + +/** + * Connects the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. + * + * If you have an existing struct sockaddr you can convert it to a NSData object like so: + * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; + * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; + * + * By design, UDP is a connectionless protocol, and connecting is not needed. + * + * Choosing to connect to a specific address has the following effect: + * - You will only be able to send data to the connected address. + * - You will only be able to receive data from the connected address. + * - You will receive ICMP messages that come from the connected address, such as "connection refused". + * + * Connecting a UDP socket does not result in any communication on the socket. + * It simply changes the internal state of the socket. + * + * You cannot bind a socket after its been connected. + * You can only connect a socket once. + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. + * + * Note: Unlike the connectToHost:onPort:error: method, this method does not require a DNS lookup. + * Thus when this method returns, the connection has either failed or fully completed. + * In other words, this method is synchronous, unlike the asynchronous connectToHost::: method. + * However, for compatibility and simplification of delegate code, if this method returns YES + * then the corresponding delegate method (udpSocket:didConnectToHost:port:) is still invoked. +**/ +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; + +#pragma mark Multicast + +/** + * Join multicast group. + * Group should be an IP address (eg @"225.228.0.1"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr; + +/** + * Join multicast group. + * Group should be an IP address (eg @"225.228.0.1"). + * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ +- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; + +- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr; +- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; + +/** + * Send multicast on a specified interface. + * For IPv4, interface should be the the IP address of the interface (eg @"192.168.10.1"). + * For IPv6, interface should be the a network interface name (eg @"en0"). + * + * On success, returns YES. + * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. +**/ + +- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; +- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; + +#pragma mark Reuse Port + +/** + * By default, only one socket can be bound to a given IP address + port at a time. + * To enable multiple processes to simultaneously bind to the same address+port, + * you need to enable this functionality in the socket. All processes that wish to + * use the address+port simultaneously must all enable reuse port on the socket + * bound to that port. + **/ +- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr; + +#pragma mark Broadcast + +/** + * By default, the underlying socket in the OS will not allow you to send broadcast messages. + * In order to send broadcast messages, you need to enable this functionality in the socket. + * + * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is + * delivered to every host on the network. + * The reason this is generally disabled by default (by the OS) is to prevent + * accidental broadcast messages from flooding the network. +**/ +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr; + +#pragma mark Sending + +/** + * Asynchronously sends the given data, with the given timeout and tag. + * + * This method may only be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given host and port. + * + * This method cannot be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param host + * The destination to send the udp packet to. + * May be specified as a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). + * You may also use the convenience strings of "loopback" or "localhost". + * + * @param port + * The port of the host to send to. + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data + toHost:(NSString *)host + port:(uint16_t)port + withTimeout:(NSTimeInterval)timeout + tag:(long)tag; + +/** + * Asynchronously sends the given data, with the given timeout and tag, to the given address. + * + * This method cannot be used with a connected socket. + * Recall that connecting is optional for a UDP socket. + * For connected sockets, data can only be sent to the connected address. + * For non-connected sockets, the remote destination is specified for each packet. + * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. + * + * @param data + * The data to send. + * If data is nil or zero-length, this method does nothing. + * If passing NSMutableData, please read the thread-safety notice below. + * + * @param remoteAddr + * The address to send the data to (specified as a sockaddr structure wrapped in a NSData object). + * + * @param timeout + * The timeout for the send opeartion. + * If the timeout value is negative, the send operation will not use a timeout. + * + * @param tag + * The tag is for your convenience. + * It is not sent or received over the socket in any manner what-so-ever. + * It is reported back as a parameter in the udpSocket:didSendDataWithTag: + * or udpSocket:didNotSendDataWithTag:dueToError: methods. + * You can use it as an array index, state id, type constant, etc. + * + * + * Thread-Safety Note: + * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while + * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method + * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying + * that this particular send operation has completed. + * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. + * It simply retains it for performance reasons. + * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. + * Copying this data adds an unwanted/unneeded overhead. + * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket + * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time + * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. +**/ +- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag; + +/** + * You may optionally set a send filter for the socket. + * A filter can provide several interesting possibilities: + * + * 1. Optional caching of resolved addresses for domain names. + * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. + * + * 2. Reusable modules of code for bandwidth monitoring. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * For more information about GCDAsyncUdpSocketSendFilterBlock, see the documentation for its typedef. + * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. + * + * Note: This method invokes setSendFilter:withQueue:isAsynchronous: (documented below), + * passing YES for the isAsynchronous parameter. +**/ +- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; + +/** + * The receive filter can be run via dispatch_async or dispatch_sync. + * Most typical situations call for asynchronous operation. + * + * However, there are a few situations in which synchronous operation is preferred. + * Such is the case when the filter is extremely minimal and fast. + * This is because dispatch_sync is faster than dispatch_async. + * + * If you choose synchronous operation, be aware of possible deadlock conditions. + * Since the socket queue is executing your block via dispatch_sync, + * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. + * For example, you can't query properties on the socket. +**/ +- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock + withQueue:(nullable dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous; + +#pragma mark Receiving + +/** + * There are two modes of operation for receiving packets: one-at-a-time & continuous. + * + * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. + * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, + * where your state machine may not always be ready to process incoming packets. + * + * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. + * Receiving packets continuously is better suited to real-time streaming applications. + * + * You may switch back and forth between one-at-a-time mode and continuous mode. + * If the socket is currently in continuous mode, calling this method will switch it to one-at-a-time mode. + * + * When a packet is received (and not filtered by the optional receive filter), + * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. + * + * If the socket is able to begin receiving packets, this method returns YES. + * Otherwise it returns NO, and sets the errPtr with appropriate error information. + * + * An example error: + * You created a udp socket to act as a server, and immediately called receive. + * You forgot to first bind the socket to a port number, and received a error with a message like: + * "Must bind socket before you can receive data." +**/ +- (BOOL)receiveOnce:(NSError **)errPtr; + +/** + * There are two modes of operation for receiving packets: one-at-a-time & continuous. + * + * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. + * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, + * where your state machine may not always be ready to process incoming packets. + * + * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. + * Receiving packets continuously is better suited to real-time streaming applications. + * + * You may switch back and forth between one-at-a-time mode and continuous mode. + * If the socket is currently in one-at-a-time mode, calling this method will switch it to continuous mode. + * + * For every received packet (not filtered by the optional receive filter), + * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. + * + * If the socket is able to begin receiving packets, this method returns YES. + * Otherwise it returns NO, and sets the errPtr with appropriate error information. + * + * An example error: + * You created a udp socket to act as a server, and immediately called receive. + * You forgot to first bind the socket to a port number, and received a error with a message like: + * "Must bind socket before you can receive data." +**/ +- (BOOL)beginReceiving:(NSError **)errPtr; + +/** + * If the socket is currently receiving (beginReceiving has been called), this method pauses the receiving. + * That is, it won't read any more packets from the underlying OS socket until beginReceiving is called again. + * + * Important Note: + * GCDAsyncUdpSocket may be running in parallel with your code. + * That is, your delegate is likely running on a separate thread/dispatch_queue. + * When you invoke this method, GCDAsyncUdpSocket may have already dispatched delegate methods to be invoked. + * Thus, if those delegate methods have already been dispatch_async'd, + * your didReceive delegate method may still be invoked after this method has been called. + * You should be aware of this, and program defensively. +**/ +- (void)pauseReceiving; + +/** + * You may optionally set a receive filter for the socket. + * This receive filter may be set to run in its own queue (independent of delegate queue). + * + * A filter can provide several useful features. + * + * 1. Many times udp packets need to be parsed. + * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. + * The end result is a parallel socket io, datagram parsing, and packet processing. + * + * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. + * The filter can prevent such packets from arriving at the delegate. + * And because the filter can run in its own independent queue, this doesn't slow down the delegate. + * + * - Since the udp protocol does not guarantee delivery, udp packets may be lost. + * Many protocols built atop udp thus provide various resend/re-request algorithms. + * This sometimes results in duplicate packets arriving. + * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. + * + * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. + * Such packets need to be ignored. + * + * 3. Sometimes traffic shapers are needed to simulate real world environments. + * A filter allows you to write custom code to simulate such environments. + * The ability to code this yourself is especially helpful when your simulated environment + * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), + * or the system tools to handle this aren't available (e.g. on a mobile device). + * + * Example: + * + * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { + * + * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; + * + * *context = response; + * return (response != nil); + * }; + * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; + * + * For more information about GCDAsyncUdpSocketReceiveFilterBlock, see the documentation for its typedef. + * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. + * + * Note: This method invokes setReceiveFilter:withQueue:isAsynchronous: (documented below), + * passing YES for the isAsynchronous parameter. +**/ +- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; + +/** + * The receive filter can be run via dispatch_async or dispatch_sync. + * Most typical situations call for asynchronous operation. + * + * However, there are a few situations in which synchronous operation is preferred. + * Such is the case when the filter is extremely minimal and fast. + * This is because dispatch_sync is faster than dispatch_async. + * + * If you choose synchronous operation, be aware of possible deadlock conditions. + * Since the socket queue is executing your block via dispatch_sync, + * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. + * For example, you can't query properties on the socket. +**/ +- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock + withQueue:(nullable dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous; + +#pragma mark Closing + +/** + * Immediately closes the underlying socket. + * Any pending send operations are discarded. + * + * The GCDAsyncUdpSocket instance may optionally be used again. + * (it will setup/configure/use another unnderlying BSD socket). +**/ +- (void)close; + +/** + * Closes the underlying socket after all pending send operations have been sent. + * + * The GCDAsyncUdpSocket instance may optionally be used again. + * (it will setup/configure/use another unnderlying BSD socket). +**/ +- (void)closeAfterSending; + +#pragma mark Advanced +/** + * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. + * In most cases, the instance creates this queue itself. + * However, to allow for maximum flexibility, the internal queue may be passed in the init method. + * This allows for some advanced options such as controlling socket priority via target queues. + * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. + * + * For example, imagine there are 2 queues: + * dispatch_queue_t socketQueue; + * dispatch_queue_t socketTargetQueue; + * + * If you do this (pseudo-code): + * socketQueue.targetQueue = socketTargetQueue; + * + * Then all socketQueue operations will actually get run on the given socketTargetQueue. + * This is fine and works great in most situations. + * But if you run code directly from within the socketTargetQueue that accesses the socket, + * you could potentially get deadlock. Imagine the following code: + * + * - (BOOL)socketHasSomething + * { + * __block BOOL result = NO; + * dispatch_block_t block = ^{ + * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; + * } + * if (is_executing_on_queue(socketQueue)) + * block(); + * else + * dispatch_sync(socketQueue, block); + * + * return result; + * } + * + * What happens if you call this method from the socketTargetQueue? The result is deadlock. + * This is because the GCD API offers no mechanism to discover a queue's targetQueue. + * Thus we have no idea if our socketQueue is configured with a targetQueue. + * If we had this information, we could easily avoid deadlock. + * But, since these API's are missing or unfeasible, you'll have to explicitly set it. + * + * IF you pass a socketQueue via the init method, + * AND you've configured the passed socketQueue with a targetQueue, + * THEN you should pass the end queue in the target hierarchy. + * + * For example, consider the following queue hierarchy: + * socketQueue -> ipQueue -> moduleQueue + * + * This example demonstrates priority shaping within some server. + * All incoming client connections from the same IP address are executed on the same target queue. + * And all connections for a particular module are executed on the same target queue. + * Thus, the priority of all networking for the entire module can be changed on the fly. + * Additionally, networking traffic from a single IP cannot monopolize the module. + * + * Here's how you would accomplish something like that: + * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock + * { + * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); + * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; + * + * dispatch_set_target_queue(socketQueue, ipQueue); + * dispatch_set_target_queue(iqQueue, moduleQueue); + * + * return socketQueue; + * } + * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket + * { + * [clientConnections addObject:newSocket]; + * [newSocket markSocketQueueTargetQueue:moduleQueue]; + * } + * + * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. + * This is often NOT the case, as such queues are used solely for execution shaping. + **/ +- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; +- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; + +/** + * It's not thread-safe to access certain variables from outside the socket's internal queue. + * + * For example, the socket file descriptor. + * File descriptors are simply integers which reference an index in the per-process file table. + * However, when one requests a new file descriptor (by opening a file or socket), + * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. + * So if we're not careful, the following could be possible: + * + * - Thread A invokes a method which returns the socket's file descriptor. + * - The socket is closed via the socket's internal queue on thread B. + * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. + * - Thread A is now accessing/altering the file instead of the socket. + * + * In addition to this, other variables are not actually objects, + * and thus cannot be retained/released or even autoreleased. + * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. + * + * Although there are internal variables that make it difficult to maintain thread-safety, + * it is important to provide access to these variables + * to ensure this class can be used in a wide array of environments. + * This method helps to accomplish this by invoking the current block on the socket's internal queue. + * The methods below can be invoked from within the block to access + * those generally thread-unsafe internal variables in a thread-safe manner. + * The given block will be invoked synchronously on the socket's internal queue. + * + * If you save references to any protected variables and use them outside the block, you do so at your own peril. +**/ +- (void)performBlock:(dispatch_block_t)block; + +/** + * These methods are only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Provides access to the socket's file descriptor(s). + * If the socket isn't connected, or explicity bound to a particular interface, + * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. +**/ +- (int)socketFD; +- (int)socket4FD; +- (int)socket6FD; + +#if TARGET_OS_IPHONE + +/** + * These methods are only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Returns (creating if necessary) a CFReadStream/CFWriteStream for the internal socket. + * + * Generally GCDAsyncUdpSocket doesn't use CFStream. (It uses the faster GCD API's.) + * However, if you need one for any reason, + * these methods are a convenient way to get access to a safe instance of one. +**/ +- (nullable CFReadStreamRef)readStream; +- (nullable CFWriteStreamRef)writeStream; + +/** + * This method is only available from within the context of a performBlock: invocation. + * See the documentation for the performBlock: method above. + * + * Configures the socket to allow it to operate when the iOS application has been backgrounded. + * In other words, this method creates a read & write stream, and invokes: + * + * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * + * Returns YES if successful, NO otherwise. + * + * Example usage: + * + * [asyncUdpSocket performBlock:^{ + * [asyncUdpSocket enableBackgroundingOnSocket]; + * }]; + * + * + * NOTE : Apple doesn't currently support backgrounding UDP sockets. (Only TCP for now). +**/ +//- (BOOL)enableBackgroundingOnSockets; + +#endif + +#pragma mark Utilities + +/** + * Extracting host/port/family information from raw address data. +**/ + ++ (nullable NSString *)hostFromAddress:(NSData *)address; ++ (uint16_t)portFromAddress:(NSData *)address; ++ (int)familyFromAddress:(NSData *)address; + ++ (BOOL)isIPv4Address:(NSData *)address; ++ (BOOL)isIPv6Address:(NSData *)address; + ++ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr fromAddress:(NSData *)address; ++ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr family:(int * __nullable)afPtr fromAddress:(NSData *)address; + +@end + +NS_ASSUME_NONNULL_END diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.m b/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.m new file mode 100755 index 0000000..af0cbf2 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/GCD/GCDAsyncUdpSocket.m @@ -0,0 +1,5632 @@ +// +// GCDAsyncUdpSocket +// +// This class is in the public domain. +// Originally created by Robbie Hanson of Deusty LLC. +// Updated and maintained by Deusty LLC and the Apple development community. +// +// https://github.com/robbiehanson/CocoaAsyncSocket +// + +#import "GCDAsyncUdpSocket.h" + +#if ! __has_feature(objc_arc) +#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +// For more information see: https://github.com/robbiehanson/CocoaAsyncSocket/wiki/ARC +#endif + +#if TARGET_OS_IPHONE + #import + #import +#endif + +#import +#import +#import +#import +#import +#import +#import + + +#if 0 + +// Logging Enabled - See log level below + +// Logging uses the CocoaLumberjack framework (which is also GCD based). +// https://github.com/robbiehanson/CocoaLumberjack +// +// It allows us to do a lot of logging without significantly slowing down the code. +#import "DDLog.h" + +#define LogAsync NO +#define LogContext 65535 + +#define LogObjc(flg, frmt, ...) LOG_OBJC_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) +#define LogC(flg, frmt, ...) LOG_C_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) + +#define LogError(frmt, ...) LogObjc(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogWarn(frmt, ...) LogObjc(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogInfo(frmt, ...) LogObjc(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogVerbose(frmt, ...) LogObjc(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) + +#define LogCError(frmt, ...) LogC(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCWarn(frmt, ...) LogC(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCInfo(frmt, ...) LogC(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) +#define LogCVerbose(frmt, ...) LogC(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) + +#define LogTrace() LogObjc(LOG_FLAG_VERBOSE, @"%@: %@", THIS_FILE, THIS_METHOD) +#define LogCTrace() LogC(LOG_FLAG_VERBOSE, @"%@: %s", THIS_FILE, __FUNCTION__) + +// Log levels : off, error, warn, info, verbose +static const int logLevel = LOG_LEVEL_VERBOSE; + +#else + +// Logging Disabled + +#define LogError(frmt, ...) {} +#define LogWarn(frmt, ...) {} +#define LogInfo(frmt, ...) {} +#define LogVerbose(frmt, ...) {} + +#define LogCError(frmt, ...) {} +#define LogCWarn(frmt, ...) {} +#define LogCInfo(frmt, ...) {} +#define LogCVerbose(frmt, ...) {} + +#define LogTrace() {} +#define LogCTrace(frmt, ...) {} + +#endif + +/** + * Seeing a return statements within an inner block + * can sometimes be mistaken for a return point of the enclosing method. + * This makes inline blocks a bit easier to read. +**/ +#define return_from_block return + +/** + * A socket file descriptor is really just an integer. + * It represents the index of the socket within the kernel. + * This makes invalid file descriptor comparisons easier to read. +**/ +#define SOCKET_NULL -1 + +/** + * Just to type less code. +**/ +#define AutoreleasedBlock(block) ^{ @autoreleasepool { block(); }} + + +@class GCDAsyncUdpSendPacket; + +NSString *const GCDAsyncUdpSocketException = @"GCDAsyncUdpSocketException"; +NSString *const GCDAsyncUdpSocketErrorDomain = @"GCDAsyncUdpSocketErrorDomain"; + +NSString *const GCDAsyncUdpSocketQueueName = @"GCDAsyncUdpSocket"; +NSString *const GCDAsyncUdpSocketThreadName = @"GCDAsyncUdpSocket-CFStream"; + +enum GCDAsyncUdpSocketFlags +{ + kDidCreateSockets = 1 << 0, // If set, the sockets have been created. + kDidBind = 1 << 1, // If set, bind has been called. + kConnecting = 1 << 2, // If set, a connection attempt is in progress. + kDidConnect = 1 << 3, // If set, socket is connected. + kReceiveOnce = 1 << 4, // If set, one-at-a-time receive is enabled + kReceiveContinuous = 1 << 5, // If set, continuous receive is enabled + kIPv4Deactivated = 1 << 6, // If set, socket4 was closed due to bind or connect on IPv6. + kIPv6Deactivated = 1 << 7, // If set, socket6 was closed due to bind or connect on IPv4. + kSend4SourceSuspended = 1 << 8, // If set, send4Source is suspended. + kSend6SourceSuspended = 1 << 9, // If set, send6Source is suspended. + kReceive4SourceSuspended = 1 << 10, // If set, receive4Source is suspended. + kReceive6SourceSuspended = 1 << 11, // If set, receive6Source is suspended. + kSock4CanAcceptBytes = 1 << 12, // If set, we know socket4 can accept bytes. If unset, it's unknown. + kSock6CanAcceptBytes = 1 << 13, // If set, we know socket6 can accept bytes. If unset, it's unknown. + kForbidSendReceive = 1 << 14, // If set, no new send or receive operations are allowed to be queued. + kCloseAfterSends = 1 << 15, // If set, close as soon as no more sends are queued. + kFlipFlop = 1 << 16, // Used to alternate between IPv4 and IPv6 sockets. +#if TARGET_OS_IPHONE + kAddedStreamListener = 1 << 17, // If set, CFStreams have been added to listener thread +#endif +}; + +enum GCDAsyncUdpSocketConfig +{ + kIPv4Disabled = 1 << 0, // If set, IPv4 is disabled + kIPv6Disabled = 1 << 1, // If set, IPv6 is disabled + kPreferIPv4 = 1 << 2, // If set, IPv4 is preferred over IPv6 + kPreferIPv6 = 1 << 3, // If set, IPv6 is preferred over IPv4 +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface GCDAsyncUdpSocket () +{ +#if __has_feature(objc_arc_weak) + __weak id delegate; +#else + __unsafe_unretained id delegate; +#endif + dispatch_queue_t delegateQueue; + + GCDAsyncUdpSocketReceiveFilterBlock receiveFilterBlock; + dispatch_queue_t receiveFilterQueue; + BOOL receiveFilterAsync; + + GCDAsyncUdpSocketSendFilterBlock sendFilterBlock; + dispatch_queue_t sendFilterQueue; + BOOL sendFilterAsync; + + uint32_t flags; + uint16_t config; + + uint16_t max4ReceiveSize; + uint32_t max6ReceiveSize; + + uint16_t maxSendSize; + + int socket4FD; + int socket6FD; + + dispatch_queue_t socketQueue; + + dispatch_source_t send4Source; + dispatch_source_t send6Source; + dispatch_source_t receive4Source; + dispatch_source_t receive6Source; + dispatch_source_t sendTimer; + + GCDAsyncUdpSendPacket *currentSend; + NSMutableArray *sendQueue; + + unsigned long socket4FDBytesAvailable; + unsigned long socket6FDBytesAvailable; + + uint32_t pendingFilterOperations; + + NSData *cachedLocalAddress4; + NSString *cachedLocalHost4; + uint16_t cachedLocalPort4; + + NSData *cachedLocalAddress6; + NSString *cachedLocalHost6; + uint16_t cachedLocalPort6; + + NSData *cachedConnectedAddress; + NSString *cachedConnectedHost; + uint16_t cachedConnectedPort; + int cachedConnectedFamily; + + void *IsOnSocketQueueOrTargetQueueKey; + +#if TARGET_OS_IPHONE + CFStreamClientContext streamContext; + CFReadStreamRef readStream4; + CFReadStreamRef readStream6; + CFWriteStreamRef writeStream4; + CFWriteStreamRef writeStream6; +#endif + + id userData; +} + +- (void)resumeSend4Source; +- (void)resumeSend6Source; +- (void)resumeReceive4Source; +- (void)resumeReceive6Source; +- (void)closeSockets; + +- (void)maybeConnect; +- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr; +- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr; + +- (void)maybeDequeueSend; +- (void)doPreSend; +- (void)doSend; +- (void)endCurrentSend; +- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout; + +- (void)doReceive; +- (void)doReceiveEOF; + +- (void)closeWithError:(NSError *)error; + +- (BOOL)performMulticastRequest:(int)requestType forGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr; + +#if TARGET_OS_IPHONE +- (BOOL)createReadAndWriteStreams:(NSError **)errPtr; +- (BOOL)registerForStreamCallbacks:(NSError **)errPtr; +- (BOOL)addStreamsToRunLoop:(NSError **)errPtr; +- (BOOL)openStreams:(NSError **)errPtr; +- (void)removeStreamsFromRunLoop; +- (void)closeReadAndWriteStreams; +#endif + ++ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; ++ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; ++ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; ++ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; + +#if TARGET_OS_IPHONE +// Forward declaration ++ (void)listenerThread:(id)unused; +#endif + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The GCDAsyncUdpSendPacket encompasses the instructions for a single send/write. +**/ +@interface GCDAsyncUdpSendPacket : NSObject { +@public + NSData *buffer; + NSTimeInterval timeout; + long tag; + + BOOL resolveInProgress; + BOOL filterInProgress; + + NSArray *resolvedAddresses; + NSError *resolveError; + + NSData *address; + int addressFamily; +} + +- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i NS_DESIGNATED_INITIALIZER; + +@end + +@implementation GCDAsyncUdpSendPacket + +// Cover the superclass' designated initializer +- (instancetype)init NS_UNAVAILABLE +{ + NSAssert(0, @"Use the designated initializer"); + return nil; +} + +- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i +{ + if ((self = [super init])) + { + buffer = d; + timeout = t; + tag = i; + + resolveInProgress = NO; + } + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface GCDAsyncUdpSpecialPacket : NSObject { +@public +// uint8_t type; + + BOOL resolveInProgress; + + NSArray *addresses; + NSError *error; +} + +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +@implementation GCDAsyncUdpSpecialPacket + +- (instancetype)init +{ + self = [super init]; + return self; +} + + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation GCDAsyncUdpSocket + +- (instancetype)init +{ + LogTrace(); + + return [self initWithDelegate:nil delegateQueue:NULL socketQueue:NULL]; +} + +- (instancetype)initWithSocketQueue:(dispatch_queue_t)sq +{ + LogTrace(); + + return [self initWithDelegate:nil delegateQueue:NULL socketQueue:sq]; +} + +- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq +{ + LogTrace(); + + return [self initWithDelegate:aDelegate delegateQueue:dq socketQueue:NULL]; +} + +- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq +{ + LogTrace(); + + if ((self = [super init])) + { + delegate = aDelegate; + + if (dq) + { + delegateQueue = dq; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(delegateQueue); + #endif + } + + max4ReceiveSize = 65535; + max6ReceiveSize = 65535; + + maxSendSize = 65535; + + socket4FD = SOCKET_NULL; + socket6FD = SOCKET_NULL; + + if (sq) + { + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + @"The given socketQueue parameter must not be a concurrent queue."); + + socketQueue = sq; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(socketQueue); + #endif + } + else + { + socketQueue = dispatch_queue_create([GCDAsyncUdpSocketQueueName UTF8String], NULL); + } + + // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. + // From the documentation: + // + // > Keys are only compared as pointers and are never dereferenced. + // > Thus, you can use a pointer to a static variable for a specific subsystem or + // > any other value that allows you to identify the value uniquely. + // + // We're just going to use the memory address of an ivar. + // Specifically an ivar that is explicitly named for our purpose to make the code more readable. + // + // However, it feels tedious (and less readable) to include the "&" all the time: + // dispatch_get_specific(&IsOnSocketQueueOrTargetQueueKey) + // + // So we're going to make it so it doesn't matter if we use the '&' or not, + // by assigning the value of the ivar to the address of the ivar. + // Thus: IsOnSocketQueueOrTargetQueueKey == &IsOnSocketQueueOrTargetQueueKey; + + IsOnSocketQueueOrTargetQueueKey = &IsOnSocketQueueOrTargetQueueKey; + + void *nonNullUnusedPointer = (__bridge void *)self; + dispatch_queue_set_specific(socketQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); + + currentSend = nil; + sendQueue = [[NSMutableArray alloc] initWithCapacity:5]; + + #if TARGET_OS_IPHONE + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationWillEnterForeground:) + name:UIApplicationWillEnterForegroundNotification + object:nil]; + #endif + } + return self; +} + +- (void)dealloc +{ + LogInfo(@"%@ - %@ (start)", THIS_METHOD, self); + +#if TARGET_OS_IPHONE + [[NSNotificationCenter defaultCenter] removeObserver:self]; +#endif + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + [self closeWithError:nil]; + } + else + { + dispatch_sync(socketQueue, ^{ + [self closeWithError:nil]; + }); + } + + delegate = nil; + #if !OS_OBJECT_USE_OBJC + if (delegateQueue) dispatch_release(delegateQueue); + #endif + delegateQueue = NULL; + + #if !OS_OBJECT_USE_OBJC + if (socketQueue) dispatch_release(socketQueue); + #endif + socketQueue = NULL; + + LogInfo(@"%@ - %@ (finish)", THIS_METHOD, self); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Configuration +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (id)delegate +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + return delegate; + } + else + { + __block id result = nil; + + dispatch_sync(socketQueue, ^{ + result = self->delegate; + }); + + return result; + } +} + +- (void)setDelegate:(id)newDelegate synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + self->delegate = newDelegate; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegate:(id)newDelegate +{ + [self setDelegate:newDelegate synchronously:NO]; +} + +- (void)synchronouslySetDelegate:(id)newDelegate +{ + [self setDelegate:newDelegate synchronously:YES]; +} + +- (dispatch_queue_t)delegateQueue +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + return delegateQueue; + } + else + { + __block dispatch_queue_t result = NULL; + + dispatch_sync(socketQueue, ^{ + result = self->delegateQueue; + }); + + return result; + } +} + +- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->delegateQueue) dispatch_release(self->delegateQueue); + if (newDelegateQueue) dispatch_retain(newDelegateQueue); + #endif + + self->delegateQueue = newDelegateQueue; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegateQueue:newDelegateQueue synchronously:NO]; +} + +- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegateQueue:newDelegateQueue synchronously:YES]; +} + +- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + if (delegatePtr) *delegatePtr = delegate; + if (delegateQueuePtr) *delegateQueuePtr = delegateQueue; + } + else + { + __block id dPtr = NULL; + __block dispatch_queue_t dqPtr = NULL; + + dispatch_sync(socketQueue, ^{ + dPtr = self->delegate; + dqPtr = self->delegateQueue; + }); + + if (delegatePtr) *delegatePtr = dPtr; + if (delegateQueuePtr) *delegateQueuePtr = dqPtr; + } +} + +- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously +{ + dispatch_block_t block = ^{ + + self->delegate = newDelegate; + + #if !OS_OBJECT_USE_OBJC + if (self->delegateQueue) dispatch_release(self->delegateQueue); + if (newDelegateQueue) dispatch_retain(newDelegateQueue); + #endif + + self->delegateQueue = newDelegateQueue; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { + block(); + } + else { + if (synchronously) + dispatch_sync(socketQueue, block); + else + dispatch_async(socketQueue, block); + } +} + +- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO]; +} + +- (void)synchronouslySetDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue +{ + [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES]; +} + +- (BOOL)isIPv4Enabled +{ + // Note: YES means kIPv4Disabled is OFF + + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + result = ((self->config & kIPv4Disabled) == 0); + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setIPv4Enabled:(BOOL)flag +{ + // Note: YES means kIPv4Disabled is OFF + + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); + + if (flag) + self->config &= ~kIPv4Disabled; + else + self->config |= kIPv4Disabled; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (BOOL)isIPv6Enabled +{ + // Note: YES means kIPv6Disabled is OFF + + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + result = ((self->config & kIPv6Disabled) == 0); + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setIPv6Enabled:(BOOL)flag +{ + // Note: YES means kIPv6Disabled is OFF + + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); + + if (flag) + self->config &= ~kIPv6Disabled; + else + self->config |= kIPv6Disabled; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (BOOL)isIPv4Preferred +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & kPreferIPv4) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv6Preferred +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & kPreferIPv6) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPVersionNeutral +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->config & (kPreferIPv4 | kPreferIPv6)) == 0; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setPreferIPv4 +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config |= kPreferIPv4; + self->config &= ~kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setPreferIPv6 +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config &= ~kPreferIPv4; + self->config |= kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setIPVersionNeutral +{ + dispatch_block_t block = ^{ + + LogTrace(); + + self->config &= ~kPreferIPv4; + self->config &= ~kPreferIPv6; + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint16_t)maxReceiveIPv4BufferSize +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + result = self->max4ReceiveSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->max4ReceiveSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint32_t)maxReceiveIPv6BufferSize +{ + __block uint32_t result = 0; + + dispatch_block_t block = ^{ + + result = self->max6ReceiveSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->max6ReceiveSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setMaxSendBufferSize:(uint16_t)max +{ + dispatch_block_t block = ^{ + + LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); + + self->maxSendSize = max; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (uint16_t)maxSendBufferSize +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + result = self->maxSendSize; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (id)userData +{ + __block id result = nil; + + dispatch_block_t block = ^{ + + result = self->userData; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (void)setUserData:(id)arbitraryUserData +{ + dispatch_block_t block = ^{ + + if (self->userData != arbitraryUserData) + { + self->userData = arbitraryUserData; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Delegate Helpers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)notifyDidConnectToAddress:(NSData *)anAddress +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didConnectToAddress:)]) + { + NSData *address = [anAddress copy]; // In case param is NSMutableData + + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didConnectToAddress:address]; + }}); + } +} + +- (void)notifyDidNotConnect:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotConnect:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didNotConnect:error]; + }}); + } +} + +- (void)notifyDidSendDataWithTag:(long)tag +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didSendDataWithTag:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didSendDataWithTag:tag]; + }}); + } +} + +- (void)notifyDidNotSendDataWithTag:(long)tag dueToError:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotSendDataWithTag:dueToError:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didNotSendDataWithTag:tag dueToError:error]; + }}); + } +} + +- (void)notifyDidReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)context +{ + LogTrace(); + + SEL selector = @selector(udpSocket:didReceiveData:fromAddress:withFilterContext:); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:selector]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocket:self didReceiveData:data fromAddress:address withFilterContext:context]; + }}); + } +} + +- (void)notifyDidCloseWithError:(NSError *)error +{ + LogTrace(); + + __strong id theDelegate = delegate; + if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocketDidClose:withError:)]) + { + dispatch_async(delegateQueue, ^{ @autoreleasepool { + + [theDelegate udpSocketDidClose:self withError:error]; + }}); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Errors +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (NSError *)badConfigError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketBadConfigError + userInfo:userInfo]; +} + +- (NSError *)badParamError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketBadParamError + userInfo:userInfo]; +} + +- (NSError *)gaiError:(int)gai_error +{ + NSString *errMsg = [NSString stringWithCString:gai_strerror(gai_error) encoding:NSASCIIStringEncoding]; + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:gai_error userInfo:userInfo]; +} + +- (NSError *)errnoErrorWithReason:(NSString *)reason +{ + NSString *errMsg = [NSString stringWithUTF8String:strerror(errno)]; + NSDictionary *userInfo; + + if (reason) + userInfo = @{NSLocalizedDescriptionKey : errMsg, + NSLocalizedFailureReasonErrorKey : reason}; + else + userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; +} + +- (NSError *)errnoError +{ + return [self errnoErrorWithReason:nil]; +} + +/** + * Returns a standard send timeout error. +**/ +- (NSError *)sendTimeoutError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketSendTimeoutError", + @"GCDAsyncUdpSocket", [NSBundle mainBundle], + @"Send operation timed out", nil); + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketSendTimeoutError + userInfo:userInfo]; +} + +- (NSError *)socketClosedError +{ + NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketClosedError", + @"GCDAsyncUdpSocket", [NSBundle mainBundle], + @"Socket closed", nil); + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain code:GCDAsyncUdpSocketClosedError userInfo:userInfo]; +} + +- (NSError *)otherError:(NSString *)errMsg +{ + NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; + + return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain + code:GCDAsyncUdpSocketOtherError + userInfo:userInfo]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Utilities +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)preOp:(NSError **)errPtr +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (delegate == nil) // Must have delegate set + { + if (errPtr) + { + NSString *msg = @"Attempting to use socket without a delegate. Set a delegate first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if (delegateQueue == NULL) // Must have delegate queue set + { + if (errPtr) + { + NSString *msg = @"Attempting to use socket without a delegate queue. Set a delegate queue first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +/** + * This method executes on a global concurrent queue. + * When complete, it executes the given completion block on the socketQueue. +**/ +- (void)asyncResolveHost:(NSString *)aHost + port:(uint16_t)port + withCompletionBlock:(void (^)(NSArray *addresses, NSError *error))completionBlock +{ + LogTrace(); + + // Check parameter(s) + + if (aHost == nil) + { + NSString *msg = @"The host param is nil. Should be domain name or IP address string."; + NSError *error = [self badParamError:msg]; + + // We should still use dispatch_async since this method is expected to be asynchronous + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + completionBlock(nil, error); + }}); + + return; + } + + // It's possible that the given aHost parameter is actually a NSMutableString. + // So we want to copy it now, within this block that will be executed synchronously. + // This way the asynchronous lookup block below doesn't have to worry about it changing. + + NSString *host = [aHost copy]; + + + dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(globalConcurrentQueue, ^{ @autoreleasepool { + + NSMutableArray *addresses = [NSMutableArray arrayWithCapacity:2]; + NSError *error = nil; + + if ([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) + { + // Use LOOPBACK address + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(struct sockaddr_in); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(struct sockaddr_in6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_loopback; + + // Wrap the native address structures and add to list + [addresses addObject:[NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]]; + [addresses addObject:[NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]]; + } + else + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + + int gai_error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); + + if (gai_error) + { + error = [self gaiError:gai_error]; + } + else + { + for(res = res0; res; res = res->ai_next) + { + if (res->ai_family == AF_INET) + { + // Found IPv4 address + // Wrap the native address structure and add to list + + [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; + } + else if (res->ai_family == AF_INET6) + { + + // Fixes connection issues with IPv6, it is the same solution for udp socket. + // https://github.com/robbiehanson/CocoaAsyncSocket/issues/429#issuecomment-222477158 + struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)(void *)res->ai_addr; + in_port_t *portPtr = &sockaddr->sin6_port; + if ((portPtr != NULL) && (*portPtr == 0)) { + *portPtr = htons(port); + } + + // Found IPv6 address + // Wrap the native address structure and add to list + [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; + } + } + freeaddrinfo(res0); + + if ([addresses count] == 0) + { + error = [self gaiError:EAI_FAIL]; + } + } + } + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + completionBlock(addresses, error); + }}); + + }}); +} + +/** + * This method picks an address from the given list of addresses. + * The address picked depends upon which protocols are disabled, deactived, & preferred. + * + * Returns the address family (AF_INET or AF_INET6) of the picked address, + * or AF_UNSPEC and the corresponding error is there's a problem. +**/ +- (int)getAddress:(NSData **)addressPtr error:(NSError **)errorPtr fromAddresses:(NSArray *)addresses +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert([addresses count] > 0, @"Expected at least one address"); + + int resultAF = AF_UNSPEC; + NSData *resultAddress = nil; + NSError *resultError = nil; + + // Check for problems + + BOOL resolvedIPv4Address = NO; + BOOL resolvedIPv6Address = NO; + + for (NSData *address in addresses) + { + switch ([[self class] familyFromAddress:address]) + { + case AF_INET : resolvedIPv4Address = YES; break; + case AF_INET6 : resolvedIPv6Address = YES; break; + + default : NSAssert(NO, @"Addresses array contains invalid address"); + } + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && !resolvedIPv6Address) + { + NSString *msg = @"IPv4 has been disabled and DNS lookup found no IPv6 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + if (isIPv6Disabled && !resolvedIPv4Address) + { + NSString *msg = @"IPv6 has been disabled and DNS lookup found no IPv4 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + BOOL isIPv4Deactivated = (flags & kIPv4Deactivated) ? YES : NO; + BOOL isIPv6Deactivated = (flags & kIPv6Deactivated) ? YES : NO; + + if (isIPv4Deactivated && !resolvedIPv6Address) + { + NSString *msg = @"IPv4 has been deactivated due to bind/connect, and DNS lookup found no IPv6 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + if (isIPv6Deactivated && !resolvedIPv4Address) + { + NSString *msg = @"IPv6 has been deactivated due to bind/connect, and DNS lookup found no IPv4 address(es)."; + resultError = [self otherError:msg]; + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; + } + + // Extract first IPv4 and IPv6 address in list + + BOOL ipv4WasFirstInList = YES; + NSData *address4 = nil; + NSData *address6 = nil; + + for (NSData *address in addresses) + { + int af = [[self class] familyFromAddress:address]; + + if (af == AF_INET) + { + if (address4 == nil) + { + address4 = address; + + if (address6) + break; + else + ipv4WasFirstInList = YES; + } + } + else // af == AF_INET6 + { + if (address6 == nil) + { + address6 = address; + + if (address4) + break; + else + ipv4WasFirstInList = NO; + } + } + } + + // Determine socket type + + BOOL preferIPv4 = (config & kPreferIPv4) ? YES : NO; + BOOL preferIPv6 = (config & kPreferIPv6) ? YES : NO; + + BOOL useIPv4 = ((preferIPv4 && address4) || (address6 == nil)); + BOOL useIPv6 = ((preferIPv6 && address6) || (address4 == nil)); + + NSAssert(!(preferIPv4 && preferIPv6), @"Invalid config state"); + NSAssert(!(useIPv4 && useIPv6), @"Invalid logic"); + + if (useIPv4 || (!useIPv6 && ipv4WasFirstInList)) + { + resultAF = AF_INET; + resultAddress = address4; + } + else + { + resultAF = AF_INET6; + resultAddress = address6; + } + + if (addressPtr) *addressPtr = resultAddress; + if (errorPtr) *errorPtr = resultError; + + return resultAF; +} + +/** + * Finds the address(es) of an interface description. + * An inteface description may be an interface name (en0, en1, lo0) or corresponding IP (192.168.4.34). +**/ +- (void)convertIntefaceDescription:(NSString *)interfaceDescription + port:(uint16_t)port + intoAddress4:(NSData **)interfaceAddr4Ptr + address6:(NSData **)interfaceAddr6Ptr +{ + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (interfaceDescription == nil) + { + // ANY address + + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(sockaddr4); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(sockaddr6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_any; + + addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; + } + else if ([interfaceDescription isEqualToString:@"localhost"] || + [interfaceDescription isEqualToString:@"loopback"]) + { + // LOOPBACK address + + struct sockaddr_in sockaddr4; + memset(&sockaddr4, 0, sizeof(sockaddr4)); + + sockaddr4.sin_len = sizeof(struct sockaddr_in); + sockaddr4.sin_family = AF_INET; + sockaddr4.sin_port = htons(port); + sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + struct sockaddr_in6 sockaddr6; + memset(&sockaddr6, 0, sizeof(sockaddr6)); + + sockaddr6.sin6_len = sizeof(struct sockaddr_in6); + sockaddr6.sin6_family = AF_INET6; + sockaddr6.sin6_port = htons(port); + sockaddr6.sin6_addr = in6addr_loopback; + + addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; + } + else + { + const char *iface = [interfaceDescription UTF8String]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if ((addr4 == nil) && (cursor->ifa_addr->sa_family == AF_INET)) + { + // IPv4 + + struct sockaddr_in *addr = (struct sockaddr_in *)(void *)cursor->ifa_addr; + + if (strcmp(cursor->ifa_name, iface) == 0) + { + // Name match + + struct sockaddr_in nativeAddr4 = *addr; + nativeAddr4.sin_port = htons(port); + + addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + } + else + { + char ip[INET_ADDRSTRLEN]; + + const char *conversion; + conversion = inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)); + + if ((conversion != NULL) && (strcmp(ip, iface) == 0)) + { + // IP match + + struct sockaddr_in nativeAddr4 = *addr; + nativeAddr4.sin_port = htons(port); + + addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; + } + } + } + else if ((addr6 == nil) && (cursor->ifa_addr->sa_family == AF_INET6)) + { + // IPv6 + + const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; + + if (strcmp(cursor->ifa_name, iface) == 0) + { + // Name match + + struct sockaddr_in6 nativeAddr6 = *addr; + nativeAddr6.sin6_port = htons(port); + + addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + else + { + char ip[INET6_ADDRSTRLEN]; + + const char *conversion; + conversion = inet_ntop(AF_INET6, &addr->sin6_addr, ip, sizeof(ip)); + + if ((conversion != NULL) && (strcmp(ip, iface) == 0)) + { + // IP match + + struct sockaddr_in6 nativeAddr6 = *addr; + nativeAddr6.sin6_port = htons(port); + + addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; + } + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + } + + if (interfaceAddr4Ptr) *interfaceAddr4Ptr = addr4; + if (interfaceAddr6Ptr) *interfaceAddr6Ptr = addr6; +} + +/** + * Converts a numeric hostname into its corresponding address. + * The hostname is expected to be an IPv4 or IPv6 address represented as a human-readable string. (e.g. 192.168.4.34) +**/ +- (void)convertNumericHost:(NSString *)numericHost + port:(uint16_t)port + intoAddress4:(NSData **)addr4Ptr + address6:(NSData **)addr6Ptr +{ + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (numericHost) + { + NSString *portStr = [NSString stringWithFormat:@"%hu", port]; + + struct addrinfo hints, *res, *res0; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_flags = AI_NUMERICHOST; // No name resolution should be attempted + + if (getaddrinfo([numericHost UTF8String], [portStr UTF8String], &hints, &res0) == 0) + { + for (res = res0; res; res = res->ai_next) + { + if ((addr4 == nil) && (res->ai_family == AF_INET)) + { + // Found IPv4 address + // Wrap the native address structure + addr4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + else if ((addr6 == nil) && (res->ai_family == AF_INET6)) + { + // Found IPv6 address + // Wrap the native address structure + addr6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; + } + } + freeaddrinfo(res0); + } + } + + if (addr4Ptr) *addr4Ptr = addr4; + if (addr6Ptr) *addr6Ptr = addr6; +} + +- (BOOL)isConnectedToAddress4:(NSData *)someAddr4 +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(flags & kDidConnect, @"Not connected"); + NSAssert(cachedConnectedAddress, @"Expected cached connected address"); + + if (cachedConnectedFamily != AF_INET) + { + return NO; + } + + const struct sockaddr_in *sSockaddr4 = (const struct sockaddr_in *)[someAddr4 bytes]; + const struct sockaddr_in *cSockaddr4 = (const struct sockaddr_in *)[cachedConnectedAddress bytes]; + + if (memcmp(&sSockaddr4->sin_addr, &cSockaddr4->sin_addr, sizeof(struct in_addr)) != 0) + { + return NO; + } + if (memcmp(&sSockaddr4->sin_port, &cSockaddr4->sin_port, sizeof(in_port_t)) != 0) + { + return NO; + } + + return YES; +} + +- (BOOL)isConnectedToAddress6:(NSData *)someAddr6 +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(flags & kDidConnect, @"Not connected"); + NSAssert(cachedConnectedAddress, @"Expected cached connected address"); + + if (cachedConnectedFamily != AF_INET6) + { + return NO; + } + + const struct sockaddr_in6 *sSockaddr6 = (const struct sockaddr_in6 *)[someAddr6 bytes]; + const struct sockaddr_in6 *cSockaddr6 = (const struct sockaddr_in6 *)[cachedConnectedAddress bytes]; + + if (memcmp(&sSockaddr6->sin6_addr, &cSockaddr6->sin6_addr, sizeof(struct in6_addr)) != 0) + { + return NO; + } + if (memcmp(&sSockaddr6->sin6_port, &cSockaddr6->sin6_port, sizeof(in_port_t)) != 0) + { + return NO; + } + + return YES; +} + +- (unsigned int)indexOfInterfaceAddr4:(NSData *)interfaceAddr4 +{ + if (interfaceAddr4 == nil) + return 0; + if ([interfaceAddr4 length] != sizeof(struct sockaddr_in)) + return 0; + + int result = 0; + const struct sockaddr_in *ifaceAddr = (const struct sockaddr_in *)[interfaceAddr4 bytes]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if (cursor->ifa_addr->sa_family == AF_INET) + { + // IPv4 + + const struct sockaddr_in *addr = (const struct sockaddr_in *)(const void *)cursor->ifa_addr; + + if (memcmp(&addr->sin_addr, &ifaceAddr->sin_addr, sizeof(struct in_addr)) == 0) + { + result = if_nametoindex(cursor->ifa_name); + break; + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + + return result; +} + +- (unsigned int)indexOfInterfaceAddr6:(NSData *)interfaceAddr6 +{ + if (interfaceAddr6 == nil) + return 0; + if ([interfaceAddr6 length] != sizeof(struct sockaddr_in6)) + return 0; + + int result = 0; + const struct sockaddr_in6 *ifaceAddr = (const struct sockaddr_in6 *)[interfaceAddr6 bytes]; + + struct ifaddrs *addrs; + const struct ifaddrs *cursor; + + if ((getifaddrs(&addrs) == 0)) + { + cursor = addrs; + while (cursor != NULL) + { + if (cursor->ifa_addr->sa_family == AF_INET6) + { + // IPv6 + + const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; + + if (memcmp(&addr->sin6_addr, &ifaceAddr->sin6_addr, sizeof(struct in6_addr)) == 0) + { + result = if_nametoindex(cursor->ifa_name); + break; + } + } + + cursor = cursor->ifa_next; + } + + freeifaddrs(addrs); + } + + return result; +} + +- (void)setupSendAndReceiveSourcesForSocket4 +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + send4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket4FD, 0, socketQueue); + receive4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket4FD, 0, socketQueue); + + // Setup event handlers + + dispatch_source_set_event_handler(send4Source, ^{ @autoreleasepool { + + LogVerbose(@"send4EventBlock"); + LogVerbose(@"dispatch_source_get_data(send4Source) = %lu", dispatch_source_get_data(send4Source)); + + self->flags |= kSock4CanAcceptBytes; + + // If we're ready to send data, do so immediately. + // Otherwise pause the send source or it will continue to fire over and over again. + + if (self->currentSend == nil) + { + LogVerbose(@"Nothing to send"); + [self suspendSend4Source]; + } + else if (self->currentSend->resolveInProgress) + { + LogVerbose(@"currentSend - waiting for address resolve"); + [self suspendSend4Source]; + } + else if (self->currentSend->filterInProgress) + { + LogVerbose(@"currentSend - waiting on sendFilter"); + [self suspendSend4Source]; + } + else + { + [self doSend]; + } + + }}); + + dispatch_source_set_event_handler(receive4Source, ^{ @autoreleasepool { + + LogVerbose(@"receive4EventBlock"); + + self->socket4FDBytesAvailable = dispatch_source_get_data(self->receive4Source); + LogVerbose(@"socket4FDBytesAvailable: %lu", socket4FDBytesAvailable); + + if (self->socket4FDBytesAvailable > 0) + [self doReceive]; + else + [self doReceiveEOF]; + + }}); + + // Setup cancel handlers + + __block int socketFDRefCount = 2; + + int theSocketFD = socket4FD; + + #if !OS_OBJECT_USE_OBJC + dispatch_source_t theSendSource = send4Source; + dispatch_source_t theReceiveSource = receive4Source; + #endif + + dispatch_source_set_cancel_handler(send4Source, ^{ + + LogVerbose(@"send4CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(send4Source)"); + dispatch_release(theSendSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket4FD)"); + close(theSocketFD); + } + }); + + dispatch_source_set_cancel_handler(receive4Source, ^{ + + LogVerbose(@"receive4CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(receive4Source)"); + dispatch_release(theReceiveSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket4FD)"); + close(theSocketFD); + } + }); + + // We will not be able to receive until the socket is bound to a port, + // either explicitly via bind, or implicitly by connect or by sending data. + // + // But we should be able to send immediately. + + socket4FDBytesAvailable = 0; + flags |= kSock4CanAcceptBytes; + + flags |= kSend4SourceSuspended; + flags |= kReceive4SourceSuspended; +} + +- (void)setupSendAndReceiveSourcesForSocket6 +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + send6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket6FD, 0, socketQueue); + receive6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket6FD, 0, socketQueue); + + // Setup event handlers + + dispatch_source_set_event_handler(send6Source, ^{ @autoreleasepool { + + LogVerbose(@"send6EventBlock"); + LogVerbose(@"dispatch_source_get_data(send6Source) = %lu", dispatch_source_get_data(send6Source)); + + self->flags |= kSock6CanAcceptBytes; + + // If we're ready to send data, do so immediately. + // Otherwise pause the send source or it will continue to fire over and over again. + + if (self->currentSend == nil) + { + LogVerbose(@"Nothing to send"); + [self suspendSend6Source]; + } + else if (self->currentSend->resolveInProgress) + { + LogVerbose(@"currentSend - waiting for address resolve"); + [self suspendSend6Source]; + } + else if (self->currentSend->filterInProgress) + { + LogVerbose(@"currentSend - waiting on sendFilter"); + [self suspendSend6Source]; + } + else + { + [self doSend]; + } + + }}); + + dispatch_source_set_event_handler(receive6Source, ^{ @autoreleasepool { + + LogVerbose(@"receive6EventBlock"); + + self->socket6FDBytesAvailable = dispatch_source_get_data(self->receive6Source); + LogVerbose(@"socket6FDBytesAvailable: %lu", socket6FDBytesAvailable); + + if (self->socket6FDBytesAvailable > 0) + [self doReceive]; + else + [self doReceiveEOF]; + + }}); + + // Setup cancel handlers + + __block int socketFDRefCount = 2; + + int theSocketFD = socket6FD; + + #if !OS_OBJECT_USE_OBJC + dispatch_source_t theSendSource = send6Source; + dispatch_source_t theReceiveSource = receive6Source; + #endif + + dispatch_source_set_cancel_handler(send6Source, ^{ + + LogVerbose(@"send6CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(send6Source)"); + dispatch_release(theSendSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket6FD)"); + close(theSocketFD); + } + }); + + dispatch_source_set_cancel_handler(receive6Source, ^{ + + LogVerbose(@"receive6CancelBlock"); + + #if !OS_OBJECT_USE_OBJC + LogVerbose(@"dispatch_release(receive6Source)"); + dispatch_release(theReceiveSource); + #endif + + if (--socketFDRefCount == 0) + { + LogVerbose(@"close(socket6FD)"); + close(theSocketFD); + } + }); + + // We will not be able to receive until the socket is bound to a port, + // either explicitly via bind, or implicitly by connect or by sending data. + // + // But we should be able to send immediately. + + socket6FDBytesAvailable = 0; + flags |= kSock6CanAcceptBytes; + + flags |= kSend6SourceSuspended; + flags |= kReceive6SourceSuspended; +} + +- (BOOL)createSocket4:(BOOL)useIPv4 socket6:(BOOL)useIPv6 error:(NSError * __autoreleasing *)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(((flags & kDidCreateSockets) == 0), @"Sockets have already been created"); + + // CreateSocket Block + // This block will be invoked below. + + int(^createSocket)(int) = ^int (int domain) { + + int socketFD = socket(domain, SOCK_DGRAM, 0); + + if (socketFD == SOCKET_NULL) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in socket() function"]; + + return SOCKET_NULL; + } + + int status; + + // Set socket options + + status = fcntl(socketFD, F_SETFL, O_NONBLOCK); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error enabling non-blocking IO on socket (fcntl)"]; + + close(socketFD); + return SOCKET_NULL; + } + + int reuseaddr = 1; + status = setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error enabling address reuse (setsockopt)"]; + + close(socketFD); + return SOCKET_NULL; + } + + int nosigpipe = 1; + status = setsockopt(socketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error disabling sigpipe (setsockopt)"]; + + close(socketFD); + return SOCKET_NULL; + } + + /** + * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. + * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. + * + * The default maximum size of the UDP buffer in iOS is 9216 bytes. + * + * This is the reason of #222(GCD does not necessarily return the size of an entire UDP packet) and + * #535(GCDAsyncUDPSocket can not send data when data is greater than 9K) + * + * + * Enlarge the maximum size of UDP packet. + * I can not ensure the protocol type now so that the max size is set to 65535 :) + **/ + + status = setsockopt(socketFD, SOL_SOCKET, SO_SNDBUF, (const char*)&self->maxSendSize, sizeof(int)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error setting send buffer size (setsockopt)"]; + close(socketFD); + return SOCKET_NULL; + } + + status = setsockopt(socketFD, SOL_SOCKET, SO_RCVBUF, (const char*)&self->maxSendSize, sizeof(int)); + if (status == -1) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error setting receive buffer size (setsockopt)"]; + close(socketFD); + return SOCKET_NULL; + } + + + return socketFD; + }; + + // Create sockets depending upon given configuration. + + if (useIPv4) + { + LogVerbose(@"Creating IPv4 socket"); + + socket4FD = createSocket(AF_INET); + if (socket4FD == SOCKET_NULL) + { + // errPtr set in local createSocket() block + return NO; + } + } + + if (useIPv6) + { + LogVerbose(@"Creating IPv6 socket"); + + socket6FD = createSocket(AF_INET6); + if (socket6FD == SOCKET_NULL) + { + // errPtr set in local createSocket() block + + if (socket4FD != SOCKET_NULL) + { + close(socket4FD); + socket4FD = SOCKET_NULL; + } + + return NO; + } + } + + // Setup send and receive sources + + if (useIPv4) + [self setupSendAndReceiveSourcesForSocket4]; + if (useIPv6) + [self setupSendAndReceiveSourcesForSocket6]; + + flags |= kDidCreateSockets; + return YES; +} + +- (BOOL)createSockets:(NSError **)errPtr +{ + LogTrace(); + + BOOL useIPv4 = [self isIPv4Enabled]; + BOOL useIPv6 = [self isIPv6Enabled]; + + return [self createSocket4:useIPv4 socket6:useIPv6 error:errPtr]; +} + +- (void)suspendSend4Source +{ + if (send4Source && !(flags & kSend4SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(send4Source)"); + + dispatch_suspend(send4Source); + flags |= kSend4SourceSuspended; + } +} + +- (void)suspendSend6Source +{ + if (send6Source && !(flags & kSend6SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(send6Source)"); + + dispatch_suspend(send6Source); + flags |= kSend6SourceSuspended; + } +} + +- (void)resumeSend4Source +{ + if (send4Source && (flags & kSend4SourceSuspended)) + { + LogVerbose(@"dispatch_resume(send4Source)"); + + dispatch_resume(send4Source); + flags &= ~kSend4SourceSuspended; + } +} + +- (void)resumeSend6Source +{ + if (send6Source && (flags & kSend6SourceSuspended)) + { + LogVerbose(@"dispatch_resume(send6Source)"); + + dispatch_resume(send6Source); + flags &= ~kSend6SourceSuspended; + } +} + +- (void)suspendReceive4Source +{ + if (receive4Source && !(flags & kReceive4SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(receive4Source)"); + + dispatch_suspend(receive4Source); + flags |= kReceive4SourceSuspended; + } +} + +- (void)suspendReceive6Source +{ + if (receive6Source && !(flags & kReceive6SourceSuspended)) + { + LogVerbose(@"dispatch_suspend(receive6Source)"); + + dispatch_suspend(receive6Source); + flags |= kReceive6SourceSuspended; + } +} + +- (void)resumeReceive4Source +{ + if (receive4Source && (flags & kReceive4SourceSuspended)) + { + LogVerbose(@"dispatch_resume(receive4Source)"); + + dispatch_resume(receive4Source); + flags &= ~kReceive4SourceSuspended; + } +} + +- (void)resumeReceive6Source +{ + if (receive6Source && (flags & kReceive6SourceSuspended)) + { + LogVerbose(@"dispatch_resume(receive6Source)"); + + dispatch_resume(receive6Source); + flags &= ~kReceive6SourceSuspended; + } +} + +- (void)closeSocket4 +{ + if (socket4FD != SOCKET_NULL) + { + LogVerbose(@"dispatch_source_cancel(send4Source)"); + dispatch_source_cancel(send4Source); + + LogVerbose(@"dispatch_source_cancel(receive4Source)"); + dispatch_source_cancel(receive4Source); + + // For some crazy reason (in my opinion), cancelling a dispatch source doesn't + // invoke the cancel handler if the dispatch source is paused. + // So we have to unpause the source if needed. + // This allows the cancel handler to be run, which in turn releases the source and closes the socket. + + [self resumeSend4Source]; + [self resumeReceive4Source]; + + // The sockets will be closed by the cancel handlers of the corresponding source + + send4Source = NULL; + receive4Source = NULL; + + socket4FD = SOCKET_NULL; + + // Clear socket states + + socket4FDBytesAvailable = 0; + flags &= ~kSock4CanAcceptBytes; + + // Clear cached info + + cachedLocalAddress4 = nil; + cachedLocalHost4 = nil; + cachedLocalPort4 = 0; + } +} + +- (void)closeSocket6 +{ + if (socket6FD != SOCKET_NULL) + { + LogVerbose(@"dispatch_source_cancel(send6Source)"); + dispatch_source_cancel(send6Source); + + LogVerbose(@"dispatch_source_cancel(receive6Source)"); + dispatch_source_cancel(receive6Source); + + // For some crazy reason (in my opinion), cancelling a dispatch source doesn't + // invoke the cancel handler if the dispatch source is paused. + // So we have to unpause the source if needed. + // This allows the cancel handler to be run, which in turn releases the source and closes the socket. + + [self resumeSend6Source]; + [self resumeReceive6Source]; + + send6Source = NULL; + receive6Source = NULL; + + // The sockets will be closed by the cancel handlers of the corresponding source + + socket6FD = SOCKET_NULL; + + // Clear socket states + + socket6FDBytesAvailable = 0; + flags &= ~kSock6CanAcceptBytes; + + // Clear cached info + + cachedLocalAddress6 = nil; + cachedLocalHost6 = nil; + cachedLocalPort6 = 0; + } +} + +- (void)closeSockets +{ + [self closeSocket4]; + [self closeSocket6]; + + flags &= ~kDidCreateSockets; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Diagnostics +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)getLocalAddress:(NSData **)dataPtr + host:(NSString **)hostPtr + port:(uint16_t *)portPtr + forSocket:(int)socketFD + withFamily:(int)socketFamily +{ + + NSData *data = nil; + NSString *host = nil; + uint16_t port = 0; + + if (socketFamily == AF_INET) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getsockname(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) + { + data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + host = [[self class] hostFromSockaddr4:&sockaddr4]; + port = [[self class] portFromSockaddr4:&sockaddr4]; + } + else + { + LogWarn(@"Error in getsockname: %@", [self errnoError]); + } + } + else if (socketFamily == AF_INET6) + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getsockname(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) + { + data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + host = [[self class] hostFromSockaddr6:&sockaddr6]; + port = [[self class] portFromSockaddr6:&sockaddr6]; + } + else + { + LogWarn(@"Error in getsockname: %@", [self errnoError]); + } + } + + if (dataPtr) *dataPtr = data; + if (hostPtr) *hostPtr = host; + if (portPtr) *portPtr = port; + + return (data != nil); +} + +- (void)maybeUpdateCachedLocalAddress4Info +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if ( cachedLocalAddress4 || ((flags & kDidBind) == 0) || (socket4FD == SOCKET_NULL) ) + { + return; + } + + NSData *address = nil; + NSString *host = nil; + uint16_t port = 0; + + if ([self getLocalAddress:&address host:&host port:&port forSocket:socket4FD withFamily:AF_INET]) + { + + cachedLocalAddress4 = address; + cachedLocalHost4 = host; + cachedLocalPort4 = port; + } +} + +- (void)maybeUpdateCachedLocalAddress6Info +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if ( cachedLocalAddress6 || ((flags & kDidBind) == 0) || (socket6FD == SOCKET_NULL) ) + { + return; + } + + NSData *address = nil; + NSString *host = nil; + uint16_t port = 0; + + if ([self getLocalAddress:&address host:&host port:&port forSocket:socket6FD withFamily:AF_INET6]) + { + + cachedLocalAddress6 = address; + cachedLocalHost6 = host; + cachedLocalPort6 = port; + } +} + +- (NSData *)localAddress +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalAddress4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalAddress6; + } + + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalHost4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalHost6; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + if (self->socket4FD != SOCKET_NULL) + { + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalPort4; + } + else + { + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalPort6; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSData *)localAddress_IPv4 +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalAddress4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost_IPv4 +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalHost4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort_IPv4 +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress4Info]; + result = self->cachedLocalPort4; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSData *)localAddress_IPv6 +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalAddress6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)localHost_IPv6 +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalHost6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)localPort_IPv6 +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedLocalAddress6Info]; + result = self->cachedLocalPort6; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (void)maybeUpdateCachedConnectedAddressInfo +{ + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (cachedConnectedAddress || (flags & kDidConnect) == 0) + { + return; + } + + NSData *data = nil; + NSString *host = nil; + uint16_t port = 0; + int family = AF_UNSPEC; + + if (socket4FD != SOCKET_NULL) + { + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + if (getpeername(socket4FD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) + { + data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + host = [[self class] hostFromSockaddr4:&sockaddr4]; + port = [[self class] portFromSockaddr4:&sockaddr4]; + family = AF_INET; + } + else + { + LogWarn(@"Error in getpeername: %@", [self errnoError]); + } + } + else if (socket6FD != SOCKET_NULL) + { + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + if (getpeername(socket6FD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) + { + data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + host = [[self class] hostFromSockaddr6:&sockaddr6]; + port = [[self class] portFromSockaddr6:&sockaddr6]; + family = AF_INET6; + } + else + { + LogWarn(@"Error in getpeername: %@", [self errnoError]); + } + } + + + cachedConnectedAddress = data; + cachedConnectedHost = host; + cachedConnectedPort = port; + cachedConnectedFamily = family; +} + +- (NSData *)connectedAddress +{ + __block NSData *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedAddress; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (NSString *)connectedHost +{ + __block NSString *result = nil; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedHost; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (uint16_t)connectedPort +{ + __block uint16_t result = 0; + + dispatch_block_t block = ^{ + + [self maybeUpdateCachedConnectedAddressInfo]; + result = self->cachedConnectedPort; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, AutoreleasedBlock(block)); + + return result; +} + +- (BOOL)isConnected +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + result = (self->flags & kDidConnect) ? YES : NO; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isClosed +{ + __block BOOL result = YES; + + dispatch_block_t block = ^{ + + result = (self->flags & kDidCreateSockets) ? NO : YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv4 +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + if (self->flags & kDidCreateSockets) + { + result = (self->socket4FD != SOCKET_NULL); + } + else + { + result = [self isIPv4Enabled]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +- (BOOL)isIPv6 +{ + __block BOOL result = NO; + + dispatch_block_t block = ^{ + + if (self->flags & kDidCreateSockets) + { + result = (self->socket6FD != SOCKET_NULL); + } + else + { + result = [self isIPv6Enabled]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Binding +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This method runs through the various checks required prior to a bind attempt. + * It is shared between the various bind methods. +**/ +- (BOOL)preBind:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if (flags & kDidBind) + { + if (errPtr) + { + NSString *msg = @"Cannot bind a socket more than once."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot bind after connecting. If needed, bind first, then connect."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled + { + if (errPtr) + { + NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr +{ + return [self bindToPort:port interface:nil error:errPtr]; +} + +- (BOOL)bindToPort:(uint16_t)port interface:(NSString *)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preBind:&err]) + { + return_from_block; + } + + // Check the given interface + + NSData *interface4 = nil; + NSData *interface6 = nil; + + [self convertIntefaceDescription:interface port:port intoAddress4:&interface4 address6:&interface6]; + + if ((interface4 == nil) && (interface6 == nil)) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && (interface6 == nil)) + { + NSString *msg = @"IPv4 has been disabled and specified interface doesn't support IPv6."; + err = [self badParamError:msg]; + + return_from_block; + } + + if (isIPv6Disabled && (interface4 == nil)) + { + NSString *msg = @"IPv6 has been disabled and specified interface doesn't support IPv4."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Determine protocol(s) + + BOOL useIPv4 = !isIPv4Disabled && (interface4 != nil); + BOOL useIPv6 = !isIPv6Disabled && (interface6 != nil); + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) + { + return_from_block; + } + } + + // Bind the socket(s) + + LogVerbose(@"Binding socket to port(%hu) interface(%@)", port, interface); + + if (useIPv4) + { + int status = bind(self->socket4FD, (const struct sockaddr *)[interface4 bytes], (socklen_t)[interface4 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + if (useIPv6) + { + int status = bind(self->socket6FD, (const struct sockaddr *)[interface6 bytes], (socklen_t)[interface6 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + // Update flags + + self->flags |= kDidBind; + + if (!useIPv4) self->flags |= kIPv4Deactivated; + if (!useIPv6) self->flags |= kIPv6Deactivated; + + result = YES; + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error binding to port/interface: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preBind:&err]) + { + return_from_block; + } + + // Check the given address + + int addressFamily = [[self class] familyFromAddress:localAddr]; + + if (addressFamily == AF_UNSPEC) + { + NSString *msg = @"A valid IPv4 or IPv6 address was not given"; + err = [self badParamError:msg]; + + return_from_block; + } + + NSData *localAddr4 = (addressFamily == AF_INET) ? localAddr : nil; + NSData *localAddr6 = (addressFamily == AF_INET6) ? localAddr : nil; + + BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && localAddr4) + { + NSString *msg = @"IPv4 has been disabled and an IPv4 address was passed."; + err = [self badParamError:msg]; + + return_from_block; + } + + if (isIPv6Disabled && localAddr6) + { + NSString *msg = @"IPv6 has been disabled and an IPv6 address was passed."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Determine protocol(s) + + BOOL useIPv4 = !isIPv4Disabled && (localAddr4 != nil); + BOOL useIPv6 = !isIPv6Disabled && (localAddr6 != nil); + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) + { + return_from_block; + } + } + + // Bind the socket(s) + + if (useIPv4) + { + LogVerbose(@"Binding socket to address(%@:%hu)", + [[self class] hostFromAddress:localAddr4], + [[self class] portFromAddress:localAddr4]); + + int status = bind(self->socket4FD, (const struct sockaddr *)[localAddr4 bytes], (socklen_t)[localAddr4 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + else + { + LogVerbose(@"Binding socket to address(%@:%hu)", + [[self class] hostFromAddress:localAddr6], + [[self class] portFromAddress:localAddr6]); + + int status = bind(self->socket6FD, (const struct sockaddr *)[localAddr6 bytes], (socklen_t)[localAddr6 length]); + if (status == -1) + { + [self closeSockets]; + + NSString *reason = @"Error in bind() function"; + err = [self errnoErrorWithReason:reason]; + + return_from_block; + } + } + + // Update flags + + self->flags |= kDidBind; + + if (!useIPv4) self->flags |= kIPv4Deactivated; + if (!useIPv6) self->flags |= kIPv6Deactivated; + + result = YES; + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error binding to address: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Connecting +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This method runs through the various checks required prior to a connect attempt. + * It is shared between the various connect methods. +**/ +- (BOOL)preConnect:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot connect a socket more than once."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; + BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; + + if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled + { + if (errPtr) + { + NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks. + + if (![self preConnect:&err]) + { + return_from_block; + } + + // Check parameter(s) + + if (host == nil) + { + NSString *msg = @"The host param is nil. Should be domain name or IP address string."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Create special connect packet + + GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; + packet->resolveInProgress = YES; + + // Start asynchronous DNS resolve for host:port on background queue + + LogVerbose(@"Dispatching DNS resolve for connect..."); + + [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { + + // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, + // and immediately returns. Once the async resolve task completes, + // this block is executed on our socketQueue. + + packet->resolveInProgress = NO; + + packet->addresses = addresses; + packet->error = error; + + [self maybeConnect]; + }]; + + // Updates flags, add connect packet to send queue, and pump send queue + + self->flags |= kConnecting; + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + result = YES; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error connecting to host/port: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks. + + if (![self preConnect:&err]) + { + return_from_block; + } + + // Check parameter(s) + + if (remoteAddr == nil) + { + NSString *msg = @"The address param is nil. Should be a valid address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Create the socket(s) if needed + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // The remoteAddr parameter could be of type NSMutableData. + // So we copy it to be safe. + + NSData *address = [remoteAddr copy]; + NSArray *addresses = [NSArray arrayWithObject:address]; + + GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; + packet->addresses = addresses; + + // Updates flags, add connect packet to send queue, and pump send queue + + self->flags |= kConnecting; + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + result = YES; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error connecting to address: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (void)maybeConnect +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + + BOOL sendQueueReady = [currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]; + + if (sendQueueReady) + { + GCDAsyncUdpSpecialPacket *connectPacket = (GCDAsyncUdpSpecialPacket *)currentSend; + + if (connectPacket->resolveInProgress) + { + LogVerbose(@"Waiting for DNS resolve..."); + } + else + { + if (connectPacket->error) + { + [self notifyDidNotConnect:connectPacket->error]; + } + else + { + NSData *address = nil; + NSError *error = nil; + + int addressFamily = [self getAddress:&address error:&error fromAddresses:connectPacket->addresses]; + + // Perform connect + + BOOL result = NO; + + switch (addressFamily) + { + case AF_INET : result = [self connectWithAddress4:address error:&error]; break; + case AF_INET6 : result = [self connectWithAddress6:address error:&error]; break; + } + + if (result) + { + flags |= kDidBind; + flags |= kDidConnect; + + cachedConnectedAddress = address; + cachedConnectedHost = [[self class] hostFromAddress:address]; + cachedConnectedPort = [[self class] portFromAddress:address]; + cachedConnectedFamily = addressFamily; + + [self notifyDidConnectToAddress:address]; + } + else + { + [self notifyDidNotConnect:error]; + } + } + + flags &= ~kConnecting; + + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } +} + +- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + int status = connect(socket4FD, (const struct sockaddr *)[address4 bytes], (socklen_t)[address4 length]); + if (status != 0) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; + + return NO; + } + + [self closeSocket6]; + flags |= kIPv6Deactivated; + + return YES; +} + +- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + int status = connect(socket6FD, (const struct sockaddr *)[address6 bytes], (socklen_t)[address6 length]); + if (status != 0) + { + if (errPtr) + *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; + + return NO; + } + + [self closeSocket4]; + flags |= kIPv4Deactivated; + + return YES; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Multicast +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)preJoin:(NSError **)errPtr +{ + if (![self preOp:errPtr]) + { + return NO; + } + + if (!(flags & kDidBind)) + { + if (errPtr) + { + NSString *msg = @"Must bind a socket before joining a multicast group."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + if ((flags & kConnecting) || (flags & kDidConnect)) + { + if (errPtr) + { + NSString *msg = @"Cannot join a multicast group if connected."; + *errPtr = [self badConfigError:msg]; + } + return NO; + } + + return YES; +} + +- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr +{ + return [self joinMulticastGroup:group onInterface:nil error:errPtr]; +} + +- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr +{ + // IP_ADD_MEMBERSHIP == IPV6_JOIN_GROUP + return [self performMulticastRequest:IP_ADD_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; +} + +- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr +{ + return [self leaveMulticastGroup:group onInterface:nil error:errPtr]; +} + +- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr +{ + // IP_DROP_MEMBERSHIP == IPV6_LEAVE_GROUP + return [self performMulticastRequest:IP_DROP_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; +} + +- (BOOL)performMulticastRequest:(int)requestType + forGroup:(NSString *)group + onInterface:(NSString *)interface + error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + // Run through sanity checks + + if (![self preJoin:&err]) + { + return_from_block; + } + + // Convert group to address + + NSData *groupAddr4 = nil; + NSData *groupAddr6 = nil; + + [self convertNumericHost:group port:0 intoAddress4:&groupAddr4 address6:&groupAddr6]; + + if ((groupAddr4 == nil) && (groupAddr6 == nil)) + { + NSString *msg = @"Unknown group. Specify valid group IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if ((interfaceAddr4 == nil) && (interfaceAddr6 == nil)) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; + err = [self badParamError:msg]; + + return_from_block; + } + + // Perform join + + if ((self->socket4FD != SOCKET_NULL) && groupAddr4 && interfaceAddr4) + { + const struct sockaddr_in *nativeGroup = (const struct sockaddr_in *)[groupAddr4 bytes]; + const struct sockaddr_in *nativeIface = (const struct sockaddr_in *)[interfaceAddr4 bytes]; + + struct ip_mreq imreq; + imreq.imr_multiaddr = nativeGroup->sin_addr; + imreq.imr_interface = nativeIface->sin_addr; + + int status = setsockopt(self->socket4FD, IPPROTO_IP, requestType, (const void *)&imreq, sizeof(imreq)); + if (status != 0) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + + // Using IPv4 only + [self closeSocket6]; + + result = YES; + } + else if ((self->socket6FD != SOCKET_NULL) && groupAddr6 && interfaceAddr6) + { + const struct sockaddr_in6 *nativeGroup = (const struct sockaddr_in6 *)[groupAddr6 bytes]; + + struct ipv6_mreq imreq; + imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr; + imreq.ipv6mr_interface = [self indexOfInterfaceAddr6:interfaceAddr6]; + + int status = setsockopt(self->socket6FD, IPPROTO_IPV6, requestType, (const void *)&imreq, sizeof(imreq)); + if (status != 0) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + + // Using IPv6 only + [self closeSocket4]; + + result = YES; + } + else + { + NSString *msg = @"Socket, group, and interface do not have matching IP versions"; + err = [self badParamError:msg]; + + return_from_block; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if (interfaceAddr4 == nil) + { + NSString *msg = @"Unknown interface. Specify valid interface by IP address."; + err = [self badParamError:msg]; + return_from_block; + } + + if (self->socket4FD != SOCKET_NULL) { + const struct sockaddr_in *nativeIface = (struct sockaddr_in *)[interfaceAddr4 bytes]; + struct in_addr interface_addr = nativeIface->sin_addr; + int status = setsockopt(self->socket4FD, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)); + if (status != 0) { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + // Convert interface to address + + NSData *interfaceAddr4 = nil; + NSData *interfaceAddr6 = nil; + + [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; + + if (interfaceAddr6 == nil) + { + NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\")."; + err = [self badParamError:msg]; + return_from_block; + } + + if ((self->socket6FD != SOCKET_NULL)) { + uint32_t scope_id = [self indexOfInterfaceAddr6:interfaceAddr6]; + int status = setsockopt(self->socket6FD, IPPROTO_IPV6, IPV6_MULTICAST_IF, &scope_id, sizeof(scope_id)); + if (status != 0) { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Reuse port +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + int value = flag ? 1 : 0; + if (self->socket4FD != SOCKET_NULL) + { + int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + if (self->socket6FD != SOCKET_NULL) + { + int error = setsockopt(self->socket6FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Broadcast +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr +{ + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ @autoreleasepool { + + if (![self preOp:&err]) + { + return_from_block; + } + + if ((self->flags & kDidCreateSockets) == 0) + { + if (![self createSockets:&err]) + { + return_from_block; + } + } + + if (self->socket4FD != SOCKET_NULL) + { + int value = flag ? 1 : 0; + int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_BROADCAST, (const void *)&value, sizeof(value)); + + if (error) + { + err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; + + return_from_block; + } + result = YES; + } + + // IPv6 does not implement broadcast, the ability to send a packet to all hosts on the attached link. + // The same effect can be achieved by sending a packet to the link-local all hosts multicast group. + + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (errPtr) + *errPtr = err; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Sending +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)sendData:(NSData *)data withTag:(long)tag +{ + [self sendData:data withTimeout:-1.0 tag:tag]; +} + +- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + }}); + +} + +- (void)sendData:(NSData *)data + toHost:(NSString *)host + port:(uint16_t)port + withTimeout:(NSTimeInterval)timeout + tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + packet->resolveInProgress = YES; + + [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { + + // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, + // and immediately returns. Once the async resolve task completes, + // this block is executed on our socketQueue. + + packet->resolveInProgress = NO; + + packet->resolvedAddresses = addresses; + packet->resolveError = error; + + if (packet == self->currentSend) + { + LogVerbose(@"currentSend - address resolved"); + [self doPreSend]; + } + }]; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + + }}); + +} + +- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag +{ + LogTrace(); + + if ([data length] == 0) + { + LogWarn(@"Ignoring attempt to send nil/empty data."); + return; + } + + GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; + packet->addressFamily = [GCDAsyncUdpSocket familyFromAddress:remoteAddr]; + packet->address = remoteAddr; + + dispatch_async(socketQueue, ^{ @autoreleasepool { + + [self->sendQueue addObject:packet]; + [self maybeDequeueSend]; + }}); +} + +- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue +{ + [self setSendFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; +} + +- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock + withQueue:(dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous +{ + GCDAsyncUdpSocketSendFilterBlock newFilterBlock = NULL; + dispatch_queue_t newFilterQueue = NULL; + + if (filterBlock) + { + NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); + + newFilterBlock = [filterBlock copy]; + newFilterQueue = filterQueue; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(newFilterQueue); + #endif + } + + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->sendFilterQueue) dispatch_release(self->sendFilterQueue); + #endif + + self->sendFilterBlock = newFilterBlock; + self->sendFilterQueue = newFilterQueue; + self->sendFilterAsync = isAsynchronous; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)maybeDequeueSend +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + // If we don't have a send operation already in progress + if (currentSend == nil) + { + // Create the sockets if needed + if ((flags & kDidCreateSockets) == 0) + { + NSError *err = nil; + if (![self createSockets:&err]) + { + [self closeWithError:err]; + return; + } + } + + while ([sendQueue count] > 0) + { + // Dequeue the next object in the queue + currentSend = [sendQueue objectAtIndex:0]; + [sendQueue removeObjectAtIndex:0]; + + if ([currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]) + { + [self maybeConnect]; + + return; // The maybeConnect method, if it connects, will invoke this method again + } + else if (currentSend->resolveError) + { + // Notify delegate + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:currentSend->resolveError]; + + // Clear currentSend + currentSend = nil; + + continue; + } + else + { + // Start preprocessing checks on the send packet + [self doPreSend]; + + break; + } + } + + if ((currentSend == nil) && (flags & kCloseAfterSends)) + { + [self closeWithError:nil]; + } + } +} + +/** + * This method is called after a sendPacket has been dequeued. + * It performs various preprocessing checks on the packet, + * and queries the sendFilter (if set) to determine if the packet can be sent. + * + * If the packet passes all checks, it will be passed on to the doSend method. +**/ +- (void)doPreSend +{ + LogTrace(); + + // + // 1. Check for problems with send packet + // + + BOOL waitingForResolve = NO; + NSError *error = nil; + + if (flags & kDidConnect) + { + // Connected socket + + if (currentSend->resolveInProgress || currentSend->resolvedAddresses || currentSend->resolveError) + { + NSString *msg = @"Cannot specify destination of packet for connected socket"; + error = [self badConfigError:msg]; + } + else + { + currentSend->address = cachedConnectedAddress; + currentSend->addressFamily = cachedConnectedFamily; + } + } + else + { + // Non-Connected socket + + if (currentSend->resolveInProgress) + { + // We're waiting for the packet's destination to be resolved. + waitingForResolve = YES; + } + else if (currentSend->resolveError) + { + error = currentSend->resolveError; + } + else if (currentSend->address == nil) + { + if (currentSend->resolvedAddresses == nil) + { + NSString *msg = @"You must specify destination of packet for a non-connected socket"; + error = [self badConfigError:msg]; + } + else + { + // Pick the proper address to use (out of possibly several resolved addresses) + + NSData *address = nil; + int addressFamily = AF_UNSPEC; + + addressFamily = [self getAddress:&address error:&error fromAddresses:currentSend->resolvedAddresses]; + + currentSend->address = address; + currentSend->addressFamily = addressFamily; + } + } + } + + if (waitingForResolve) + { + // We're waiting for the packet's destination to be resolved. + + LogVerbose(@"currentSend - waiting for address resolve"); + + if (flags & kSock4CanAcceptBytes) { + [self suspendSend4Source]; + } + if (flags & kSock6CanAcceptBytes) { + [self suspendSend6Source]; + } + + return; + } + + if (error) + { + // Unable to send packet due to some error. + // Notify delegate and move on. + + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:error]; + [self endCurrentSend]; + [self maybeDequeueSend]; + + return; + } + + // + // 2. Query sendFilter (if applicable) + // + + if (sendFilterBlock && sendFilterQueue) + { + // Query sendFilter + + if (sendFilterAsync) + { + // Scenario 1 of 3 - Need to asynchronously query sendFilter + + currentSend->filterInProgress = YES; + GCDAsyncUdpSendPacket *sendPacket = currentSend; + + dispatch_async(sendFilterQueue, ^{ @autoreleasepool { + + BOOL allowed = self->sendFilterBlock(sendPacket->buffer, sendPacket->address, sendPacket->tag); + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + sendPacket->filterInProgress = NO; + if (sendPacket == self->currentSend) + { + if (allowed) + { + [self doSend]; + } + else + { + LogVerbose(@"currentSend - silently dropped by sendFilter"); + + [self notifyDidSendDataWithTag:self->currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } + }}); + }}); + } + else + { + // Scenario 2 of 3 - Need to synchronously query sendFilter + + __block BOOL allowed = YES; + + dispatch_sync(sendFilterQueue, ^{ @autoreleasepool { + + allowed = self->sendFilterBlock(self->currentSend->buffer, self->currentSend->address, self->currentSend->tag); + }}); + + if (allowed) + { + [self doSend]; + } + else + { + LogVerbose(@"currentSend - silently dropped by sendFilter"); + + [self notifyDidSendDataWithTag:currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } + } + } + else // if (!sendFilterBlock || !sendFilterQueue) + { + // Scenario 3 of 3 - No sendFilter. Just go straight into sending. + + [self doSend]; + } +} + +/** + * This method performs the actual sending of data in the currentSend packet. + * It should only be called if the +**/ +- (void)doSend +{ + LogTrace(); + + NSAssert(currentSend != nil, @"Invalid logic"); + + // Perform the actual send + + ssize_t result = 0; + + if (flags & kDidConnect) + { + // Connected socket + + const void *buffer = [currentSend->buffer bytes]; + size_t length = (size_t)[currentSend->buffer length]; + + if (currentSend->addressFamily == AF_INET) + { + result = send(socket4FD, buffer, length, 0); + LogVerbose(@"send(socket4FD) = %d", result); + } + else + { + result = send(socket6FD, buffer, length, 0); + LogVerbose(@"send(socket6FD) = %d", result); + } + } + else + { + // Non-Connected socket + + const void *buffer = [currentSend->buffer bytes]; + size_t length = (size_t)[currentSend->buffer length]; + + const void *dst = [currentSend->address bytes]; + socklen_t dstSize = (socklen_t)[currentSend->address length]; + + if (currentSend->addressFamily == AF_INET) + { + result = sendto(socket4FD, buffer, length, 0, dst, dstSize); + LogVerbose(@"sendto(socket4FD) = %d", result); + } + else + { + result = sendto(socket6FD, buffer, length, 0, dst, dstSize); + LogVerbose(@"sendto(socket6FD) = %d", result); + } + } + + // If the socket wasn't bound before, it is now + + if ((flags & kDidBind) == 0) + { + flags |= kDidBind; + } + + // Check the results. + // + // From the send() & sendto() manpage: + // + // Upon successful completion, the number of bytes which were sent is returned. + // Otherwise, -1 is returned and the global variable errno is set to indicate the error. + + BOOL waitingForSocket = NO; + NSError *socketError = nil; + + if (result == 0) + { + waitingForSocket = YES; + } + else if (result < 0) + { + if (errno == EAGAIN) + waitingForSocket = YES; + else + socketError = [self errnoErrorWithReason:@"Error in send() function."]; + } + + if (waitingForSocket) + { + // Not enough room in the underlying OS socket send buffer. + // Wait for a notification of available space. + + LogVerbose(@"currentSend - waiting for socket"); + + if (!(flags & kSock4CanAcceptBytes)) { + [self resumeSend4Source]; + } + if (!(flags & kSock6CanAcceptBytes)) { + [self resumeSend6Source]; + } + + if ((sendTimer == NULL) && (currentSend->timeout >= 0.0)) + { + // Unable to send packet right away. + // Start timer to timeout the send operation. + + [self setupSendTimerWithTimeout:currentSend->timeout]; + } + } + else if (socketError) + { + [self closeWithError:socketError]; + } + else // done + { + [self notifyDidSendDataWithTag:currentSend->tag]; + [self endCurrentSend]; + [self maybeDequeueSend]; + } +} + +/** + * Releases all resources associated with the currentSend. +**/ +- (void)endCurrentSend +{ + if (sendTimer) + { + dispatch_source_cancel(sendTimer); + #if !OS_OBJECT_USE_OBJC + dispatch_release(sendTimer); + #endif + sendTimer = NULL; + } + + currentSend = nil; +} + +/** + * Performs the operations to timeout the current send operation, and move on. +**/ +- (void)doSendTimeout +{ + LogTrace(); + + [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:[self sendTimeoutError]]; + [self endCurrentSend]; + [self maybeDequeueSend]; +} + +/** + * Sets up a timer that fires to timeout the current send operation. + * This method should only be called once per send packet. +**/ +- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout +{ + NSAssert(sendTimer == NULL, @"Invalid logic"); + NSAssert(timeout >= 0.0, @"Invalid logic"); + + LogTrace(); + + sendTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); + + dispatch_source_set_event_handler(sendTimer, ^{ @autoreleasepool { + + [self doSendTimeout]; + }}); + + dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); + + dispatch_source_set_timer(sendTimer, tt, DISPATCH_TIME_FOREVER, 0); + dispatch_resume(sendTimer); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Receiving +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)receiveOnce:(NSError **)errPtr +{ + LogTrace(); + + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ + + if ((self->flags & kReceiveOnce) == 0) + { + if ((self->flags & kDidCreateSockets) == 0) + { + NSString *msg = @"Must bind socket before you can receive data. " + @"You can do this explicitly via bind, or implicitly via connect or by sending data."; + + err = [self badConfigError:msg]; + return_from_block; + } + + self->flags |= kReceiveOnce; // Enable + self->flags &= ~kReceiveContinuous; // Disable + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + [self doReceive]; + }}); + } + + result = YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error in beginReceiving: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (BOOL)beginReceiving:(NSError **)errPtr +{ + LogTrace(); + + __block BOOL result = NO; + __block NSError *err = nil; + + dispatch_block_t block = ^{ + + if ((self->flags & kReceiveContinuous) == 0) + { + if ((self->flags & kDidCreateSockets) == 0) + { + NSString *msg = @"Must bind socket before you can receive data. " + @"You can do this explicitly via bind, or implicitly via connect or by sending data."; + + err = [self badConfigError:msg]; + return_from_block; + } + + self->flags |= kReceiveContinuous; // Enable + self->flags &= ~kReceiveOnce; // Disable + + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + [self doReceive]; + }}); + } + + result = YES; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); + + if (err) + LogError(@"Error in beginReceiving: %@", err); + + if (errPtr) + *errPtr = err; + + return result; +} + +- (void)pauseReceiving +{ + LogTrace(); + + dispatch_block_t block = ^{ + + self->flags &= ~kReceiveOnce; // Disable + self->flags &= ~kReceiveContinuous; // Disable + + if (self->socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (self->socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue +{ + [self setReceiveFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; +} + +- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock + withQueue:(dispatch_queue_t)filterQueue + isAsynchronous:(BOOL)isAsynchronous +{ + GCDAsyncUdpSocketReceiveFilterBlock newFilterBlock = NULL; + dispatch_queue_t newFilterQueue = NULL; + + if (filterBlock) + { + NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); + + newFilterBlock = [filterBlock copy]; + newFilterQueue = filterQueue; + #if !OS_OBJECT_USE_OBJC + dispatch_retain(newFilterQueue); + #endif + } + + dispatch_block_t block = ^{ + + #if !OS_OBJECT_USE_OBJC + if (self->receiveFilterQueue) dispatch_release(self->receiveFilterQueue); + #endif + + self->receiveFilterBlock = newFilterBlock; + self->receiveFilterQueue = newFilterQueue; + self->receiveFilterAsync = isAsynchronous; + }; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +- (void)doReceive +{ + LogTrace(); + + if ((flags & (kReceiveOnce | kReceiveContinuous)) == 0) + { + LogVerbose(@"Receiving is paused..."); + + if (socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + + return; + } + + if ((flags & kReceiveOnce) && (pendingFilterOperations > 0)) + { + LogVerbose(@"Receiving is temporarily paused (pending filter operations)..."); + + if (socket4FDBytesAvailable > 0) { + [self suspendReceive4Source]; + } + if (socket6FDBytesAvailable > 0) { + [self suspendReceive6Source]; + } + + return; + } + + if ((socket4FDBytesAvailable == 0) && (socket6FDBytesAvailable == 0)) + { + LogVerbose(@"No data available to receive..."); + + if (socket4FDBytesAvailable == 0) { + [self resumeReceive4Source]; + } + if (socket6FDBytesAvailable == 0) { + [self resumeReceive6Source]; + } + + return; + } + + // Figure out if we should receive on socket4 or socket6 + + BOOL doReceive4; + + if (flags & kDidConnect) + { + // Connected socket + + doReceive4 = (socket4FD != SOCKET_NULL); + } + else + { + // Non-Connected socket + + if (socket4FDBytesAvailable > 0) + { + if (socket6FDBytesAvailable > 0) + { + // Bytes available on socket4 & socket6 + + doReceive4 = (flags & kFlipFlop) ? YES : NO; + + flags ^= kFlipFlop; // flags = flags xor kFlipFlop; (toggle flip flop bit) + } + else { + // Bytes available on socket4, but not socket6 + doReceive4 = YES; + } + } + else { + // Bytes available on socket6, but not socket4 + doReceive4 = NO; + } + } + + // Perform socket IO + + ssize_t result = 0; + + NSData *data = nil; + NSData *addr4 = nil; + NSData *addr6 = nil; + + if (doReceive4) + { + NSAssert(socket4FDBytesAvailable > 0, @"Invalid logic"); + LogVerbose(@"Receiving on IPv4"); + + struct sockaddr_in sockaddr4; + socklen_t sockaddr4len = sizeof(sockaddr4); + + // #222: GCD does not necessarily return the size of an entire UDP packet + // from dispatch_source_get_data(), so we must use the maximum packet size. + size_t bufSize = max4ReceiveSize; + void *buf = malloc(bufSize); + + result = recvfrom(socket4FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr4, &sockaddr4len); + LogVerbose(@"recvfrom(socket4FD) = %i", (int)result); + + if (result > 0) + { + if ((size_t)result >= socket4FDBytesAvailable) + socket4FDBytesAvailable = 0; + else + socket4FDBytesAvailable -= result; + + if ((size_t)result != bufSize) { + buf = realloc(buf, result); + } + + data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; + addr4 = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; + } + else + { + LogVerbose(@"recvfrom(socket4FD) = %@", [self errnoError]); + socket4FDBytesAvailable = 0; + free(buf); + } + } + else + { + NSAssert(socket6FDBytesAvailable > 0, @"Invalid logic"); + LogVerbose(@"Receiving on IPv6"); + + struct sockaddr_in6 sockaddr6; + socklen_t sockaddr6len = sizeof(sockaddr6); + + // #222: GCD does not necessarily return the size of an entire UDP packet + // from dispatch_source_get_data(), so we must use the maximum packet size. + size_t bufSize = max6ReceiveSize; + void *buf = malloc(bufSize); + + result = recvfrom(socket6FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr6, &sockaddr6len); + LogVerbose(@"recvfrom(socket6FD) -> %i", (int)result); + + if (result > 0) + { + if ((size_t)result >= socket6FDBytesAvailable) + socket6FDBytesAvailable = 0; + else + socket6FDBytesAvailable -= result; + + if ((size_t)result != bufSize) { + buf = realloc(buf, result); + } + + data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; + addr6 = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; + } + else + { + LogVerbose(@"recvfrom(socket6FD) = %@", [self errnoError]); + socket6FDBytesAvailable = 0; + free(buf); + } + } + + + BOOL waitingForSocket = NO; + BOOL notifiedDelegate = NO; + BOOL ignored = NO; + + NSError *socketError = nil; + + if (result == 0) + { + waitingForSocket = YES; + } + else if (result < 0) + { + if (errno == EAGAIN) + waitingForSocket = YES; + else + socketError = [self errnoErrorWithReason:@"Error in recvfrom() function"]; + } + else + { + if (flags & kDidConnect) + { + if (addr4 && ![self isConnectedToAddress4:addr4]) + ignored = YES; + if (addr6 && ![self isConnectedToAddress6:addr6]) + ignored = YES; + } + + NSData *addr = (addr4 != nil) ? addr4 : addr6; + + if (!ignored) + { + if (receiveFilterBlock && receiveFilterQueue) + { + // Run data through filter, and if approved, notify delegate + + __block id filterContext = nil; + __block BOOL allowed = NO; + + if (receiveFilterAsync) + { + pendingFilterOperations++; + dispatch_async(receiveFilterQueue, ^{ @autoreleasepool { + + allowed = self->receiveFilterBlock(data, addr, &filterContext); + + // Transition back to socketQueue to get the current delegate / delegateQueue + dispatch_async(self->socketQueue, ^{ @autoreleasepool { + + self->pendingFilterOperations--; + + if (allowed) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; + } + else + { + LogVerbose(@"received packet silently dropped by receiveFilter"); + } + + if (self->flags & kReceiveOnce) + { + if (allowed) + { + // The delegate has been notified, + // so our receive once operation has completed. + self->flags &= ~kReceiveOnce; + } + else if (self->pendingFilterOperations == 0) + { + // All pending filter operations have completed, + // and none were allowed through. + // Our receive once operation hasn't completed yet. + [self doReceive]; + } + } + }}); + }}); + } + else // if (!receiveFilterAsync) + { + dispatch_sync(receiveFilterQueue, ^{ @autoreleasepool { + + allowed = self->receiveFilterBlock(data, addr, &filterContext); + }}); + + if (allowed) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; + notifiedDelegate = YES; + } + else + { + LogVerbose(@"received packet silently dropped by receiveFilter"); + ignored = YES; + } + } + } + else // if (!receiveFilterBlock || !receiveFilterQueue) + { + [self notifyDidReceiveData:data fromAddress:addr withFilterContext:nil]; + notifiedDelegate = YES; + } + } + } + + if (waitingForSocket) + { + // Wait for a notification of available data. + + if (socket4FDBytesAvailable == 0) { + [self resumeReceive4Source]; + } + if (socket6FDBytesAvailable == 0) { + [self resumeReceive6Source]; + } + } + else if (socketError) + { + [self closeWithError:socketError]; + } + else + { + if (flags & kReceiveContinuous) + { + // Continuous receive mode + [self doReceive]; + } + else + { + // One-at-a-time receive mode + if (notifiedDelegate) + { + // The delegate has been notified (no set filter). + // So our receive once operation has completed. + flags &= ~kReceiveOnce; + } + else if (ignored) + { + [self doReceive]; + } + else + { + // Waiting on asynchronous receive filter... + } + } + } +} + +- (void)doReceiveEOF +{ + LogTrace(); + + [self closeWithError:[self socketClosedError]]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Closing +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)closeWithError:(NSError *)error +{ + LogVerbose(@"closeWithError: %@", error); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (currentSend) [self endCurrentSend]; + + [sendQueue removeAllObjects]; + + // If a socket has been created, we should notify the delegate. + BOOL shouldCallDelegate = (flags & kDidCreateSockets) ? YES : NO; + + // Close all sockets, send/receive sources, cfstreams, etc +#if TARGET_OS_IPHONE + [self removeStreamsFromRunLoop]; + [self closeReadAndWriteStreams]; +#endif + [self closeSockets]; + + // Clear all flags (config remains as is) + flags = 0; + + if (shouldCallDelegate) + { + [self notifyDidCloseWithError:error]; + } +} + +- (void)close +{ + LogTrace(); + + dispatch_block_t block = ^{ @autoreleasepool { + + [self closeWithError:nil]; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); +} + +- (void)closeAfterSending +{ + LogTrace(); + + dispatch_block_t block = ^{ @autoreleasepool { + + self->flags |= kCloseAfterSends; + + if (self->currentSend == nil && [self->sendQueue count] == 0) + { + [self closeWithError:nil]; + } + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark CFStream +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#if TARGET_OS_IPHONE + +static NSThread *listenerThread; + ++ (void)ignore:(id)_ +{} + ++ (void)startListenerThreadIfNeeded +{ + static dispatch_once_t predicate; + dispatch_once(&predicate, ^{ + + listenerThread = [[NSThread alloc] initWithTarget:self + selector:@selector(listenerThread:) + object:nil]; + [listenerThread start]; + }); +} + ++ (void)listenerThread:(id)unused +{ + @autoreleasepool { + + [[NSThread currentThread] setName:GCDAsyncUdpSocketThreadName]; + + LogInfo(@"ListenerThread: Started"); + + // We can't run the run loop unless it has an associated input source or a timer. + // So we'll just create a timer that will never fire - unless the server runs for a decades. + [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow] + target:self + selector:@selector(ignore:) + userInfo:nil + repeats:YES]; + + [[NSRunLoop currentRunLoop] run]; + + LogInfo(@"ListenerThread: Stopped"); + } +} + ++ (void)addStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket +{ + LogTrace(); + NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); + + CFRunLoopRef runLoop = CFRunLoopGetCurrent(); + + if (asyncUdpSocket->readStream4) + CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->readStream6) + CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream4) + CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream6) + CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); +} + ++ (void)removeStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket +{ + LogTrace(); + NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); + + CFRunLoopRef runLoop = CFRunLoopGetCurrent(); + + if (asyncUdpSocket->readStream4) + CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->readStream6) + CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream4) + CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); + + if (asyncUdpSocket->writeStream6) + CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); +} + +static void CFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; + + switch(type) + { + case kCFStreamEventOpenCompleted: + { + LogCVerbose(@"CFReadStreamCallback - Open"); + break; + } + case kCFStreamEventHasBytesAvailable: + { + LogCVerbose(@"CFReadStreamCallback - HasBytesAvailable"); + break; + } + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + { + NSError *error = (__bridge_transfer NSError *)CFReadStreamCopyError(stream); + if (error == nil && type == kCFStreamEventEndEncountered) + { + error = [asyncUdpSocket socketClosedError]; + } + + dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { + + LogCVerbose(@"CFReadStreamCallback - %@", + (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); + + if (stream != asyncUdpSocket->readStream4 && + stream != asyncUdpSocket->readStream6 ) + { + LogCVerbose(@"CFReadStreamCallback - Ignored"); + return_from_block; + } + + [asyncUdpSocket closeWithError:error]; + + }}); + + break; + } + default: + { + LogCError(@"CFReadStreamCallback - UnknownType: %i", (int)type); + } + } + } +} + +static void CFWriteStreamCallback(CFWriteStreamRef stream, CFStreamEventType type, void *pInfo) +{ + @autoreleasepool { + GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; + + switch(type) + { + case kCFStreamEventOpenCompleted: + { + LogCVerbose(@"CFWriteStreamCallback - Open"); + break; + } + case kCFStreamEventCanAcceptBytes: + { + LogCVerbose(@"CFWriteStreamCallback - CanAcceptBytes"); + break; + } + case kCFStreamEventErrorOccurred: + case kCFStreamEventEndEncountered: + { + NSError *error = (__bridge_transfer NSError *)CFWriteStreamCopyError(stream); + if (error == nil && type == kCFStreamEventEndEncountered) + { + error = [asyncUdpSocket socketClosedError]; + } + + dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { + + LogCVerbose(@"CFWriteStreamCallback - %@", + (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); + + if (stream != asyncUdpSocket->writeStream4 && + stream != asyncUdpSocket->writeStream6 ) + { + LogCVerbose(@"CFWriteStreamCallback - Ignored"); + return_from_block; + } + + [asyncUdpSocket closeWithError:error]; + + }}); + + break; + } + default: + { + LogCError(@"CFWriteStreamCallback - UnknownType: %i", (int)type); + } + } + } +} + +- (BOOL)createReadAndWriteStreams:(NSError **)errPtr +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + NSError *err = nil; + + if (readStream4 || writeStream4 || readStream6 || writeStream6) + { + // Streams already created + return YES; + } + + if (socket4FD == SOCKET_NULL && socket6FD == SOCKET_NULL) + { + err = [self otherError:@"Cannot create streams without a file descriptor"]; + goto Failed; + } + + // Create streams + + LogVerbose(@"Creating read and write stream(s)..."); + + if (socket4FD != SOCKET_NULL) + { + CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket4FD, &readStream4, &writeStream4); + if (!readStream4 || !writeStream4) + { + err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket6FD, &readStream6, &writeStream6); + if (!readStream6 || !writeStream6) + { + err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv6]"]; + goto Failed; + } + } + + // Ensure the CFStream's don't close our underlying socket + + CFReadStreamSetProperty(readStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + CFWriteStreamSetProperty(writeStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + + CFReadStreamSetProperty(readStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + CFWriteStreamSetProperty(writeStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); + + return YES; + +Failed: + if (readStream4) + { + CFReadStreamClose(readStream4); + CFRelease(readStream4); + readStream4 = NULL; + } + if (writeStream4) + { + CFWriteStreamClose(writeStream4); + CFRelease(writeStream4); + writeStream4 = NULL; + } + if (readStream6) + { + CFReadStreamClose(readStream6); + CFRelease(readStream6); + readStream6 = NULL; + } + if (writeStream6) + { + CFWriteStreamClose(writeStream6); + CFRelease(writeStream6); + writeStream6 = NULL; + } + + if (errPtr) + *errPtr = err; + + return NO; +} + +- (BOOL)registerForStreamCallbacks:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + NSError *err = nil; + + streamContext.version = 0; + streamContext.info = (__bridge void *)self; + streamContext.retain = nil; + streamContext.release = nil; + streamContext.copyDescription = nil; + + CFOptionFlags readStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; + CFOptionFlags writeStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; + +// readStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable); +// writeStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes); + + if (socket4FD != SOCKET_NULL) + { + if (readStream4 == NULL || writeStream4 == NULL) + { + err = [self otherError:@"Read/Write stream4 is null"]; + goto Failed; + } + + BOOL r1 = CFReadStreamSetClient(readStream4, readStreamEvents, &CFReadStreamCallback, &streamContext); + BOOL r2 = CFWriteStreamSetClient(writeStream4, writeStreamEvents, &CFWriteStreamCallback, &streamContext); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamSetClient(), [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + if (readStream6 == NULL || writeStream6 == NULL) + { + err = [self otherError:@"Read/Write stream6 is null"]; + goto Failed; + } + + BOOL r1 = CFReadStreamSetClient(readStream6, readStreamEvents, &CFReadStreamCallback, &streamContext); + BOOL r2 = CFWriteStreamSetClient(writeStream6, writeStreamEvents, &CFWriteStreamCallback, &streamContext); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamSetClient() [IPv6]"]; + goto Failed; + } + } + + return YES; + +Failed: + if (readStream4) { + CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); + } + if (writeStream4) { + CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); + } + if (readStream6) { + CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); + } + if (writeStream6) { + CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); + } + + if (errPtr) *errPtr = err; + return NO; +} + +- (BOOL)addStreamsToRunLoop:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + if (!(flags & kAddedStreamListener)) + { + [[self class] startListenerThreadIfNeeded]; + [[self class] performSelector:@selector(addStreamListener:) + onThread:listenerThread + withObject:self + waitUntilDone:YES]; + + flags |= kAddedStreamListener; + } + + return YES; +} + +- (BOOL)openStreams:(NSError **)errPtr +{ + LogTrace(); + + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); + + NSError *err = nil; + + if (socket4FD != SOCKET_NULL) + { + BOOL r1 = CFReadStreamOpen(readStream4); + BOOL r2 = CFWriteStreamOpen(writeStream4); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamOpen() [IPv4]"]; + goto Failed; + } + } + + if (socket6FD != SOCKET_NULL) + { + BOOL r1 = CFReadStreamOpen(readStream6); + BOOL r2 = CFWriteStreamOpen(writeStream6); + + if (!r1 || !r2) + { + err = [self otherError:@"Error in CFStreamOpen() [IPv6]"]; + goto Failed; + } + } + + return YES; + +Failed: + if (errPtr) *errPtr = err; + return NO; +} + +- (void)removeStreamsFromRunLoop +{ + LogTrace(); + NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); + + if (flags & kAddedStreamListener) + { + [[self class] performSelector:@selector(removeStreamListener:) + onThread:listenerThread + withObject:self + waitUntilDone:YES]; + + flags &= ~kAddedStreamListener; + } +} + +- (void)closeReadAndWriteStreams +{ + LogTrace(); + + if (readStream4) + { + CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); + CFReadStreamClose(readStream4); + CFRelease(readStream4); + readStream4 = NULL; + } + if (writeStream4) + { + CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); + CFWriteStreamClose(writeStream4); + CFRelease(writeStream4); + writeStream4 = NULL; + } + if (readStream6) + { + CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); + CFReadStreamClose(readStream6); + CFRelease(readStream6); + readStream6 = NULL; + } + if (writeStream6) + { + CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); + CFWriteStreamClose(writeStream6); + CFRelease(writeStream6); + writeStream6 = NULL; + } +} + +#endif + +#if TARGET_OS_IPHONE +- (void)applicationWillEnterForeground:(NSNotification *)notification +{ + LogTrace(); + + // If the application was backgrounded, then iOS may have shut down our sockets. + // So we take a quick look to see if any of them received an EOF. + + dispatch_block_t block = ^{ @autoreleasepool { + + [self resumeReceive4Source]; + [self resumeReceive6Source]; + }}; + + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_async(socketQueue, block); +} +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Advanced +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * See header file for big discussion of this method. + **/ +- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketNewTargetQueue +{ + void *nonNullUnusedPointer = (__bridge void *)self; + dispatch_queue_set_specific(socketNewTargetQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); +} + +/** + * See header file for big discussion of this method. + **/ +- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketOldTargetQueue +{ + dispatch_queue_set_specific(socketOldTargetQueue, IsOnSocketQueueOrTargetQueueKey, NULL, NULL); +} + +- (void)performBlock:(dispatch_block_t)block +{ + if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + block(); + else + dispatch_sync(socketQueue, block); +} + +- (int)socketFD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + if (socket4FD != SOCKET_NULL) + return socket4FD; + else + return socket6FD; +} + +- (int)socket4FD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + return socket4FD; +} + +- (int)socket6FD +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return SOCKET_NULL; + } + + return socket6FD; +} + +#if TARGET_OS_IPHONE + +- (CFReadStreamRef)readStream +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NULL; + } + + NSError *err = nil; + if (![self createReadAndWriteStreams:&err]) + { + LogError(@"Error creating CFStream(s): %@", err); + return NULL; + } + + // Todo... + + if (readStream4) + return readStream4; + else + return readStream6; +} + +- (CFWriteStreamRef)writeStream +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NULL; + } + + NSError *err = nil; + if (![self createReadAndWriteStreams:&err]) + { + LogError(@"Error creating CFStream(s): %@", err); + return NULL; + } + + if (writeStream4) + return writeStream4; + else + return writeStream6; +} + +- (BOOL)enableBackgroundingOnSockets +{ + if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) + { + LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", + THIS_FILE, THIS_METHOD); + return NO; + } + + // Why is this commented out? + // See comments below. + +// NSError *err = nil; +// if (![self createReadAndWriteStreams:&err]) +// { +// LogError(@"Error creating CFStream(s): %@", err); +// return NO; +// } +// +// LogVerbose(@"Enabling backgrouding on socket"); +// +// BOOL r1, r2; +// +// if (readStream4 && writeStream4) +// { +// r1 = CFReadStreamSetProperty(readStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// r2 = CFWriteStreamSetProperty(writeStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// +// if (!r1 || !r2) +// { +// LogError(@"Error setting voip type (IPv4)"); +// return NO; +// } +// } +// +// if (readStream6 && writeStream6) +// { +// r1 = CFReadStreamSetProperty(readStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// r2 = CFWriteStreamSetProperty(writeStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); +// +// if (!r1 || !r2) +// { +// LogError(@"Error setting voip type (IPv6)"); +// return NO; +// } +// } +// +// return YES; + + // The above code will actually appear to work. + // The methods will return YES, and everything will appear fine. + // + // One tiny problem: the sockets will still get closed when the app gets backgrounded. + // + // Apple does not officially support backgrounding UDP sockets. + + return NO; +} + +#endif + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Class Methods +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 +{ + char addrBuf[INET_ADDRSTRLEN]; + + if (inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + addrBuf[0] = '\0'; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + ++ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 +{ + char addrBuf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) + { + addrBuf[0] = '\0'; + } + + return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; +} + ++ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 +{ + return ntohs(pSockaddr4->sin_port); +} + ++ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 +{ + return ntohs(pSockaddr6->sin6_port); +} + ++ (NSString *)hostFromAddress:(NSData *)address +{ + NSString *host = nil; + [self getHost:&host port:NULL family:NULL fromAddress:address]; + + return host; +} + ++ (uint16_t)portFromAddress:(NSData *)address +{ + uint16_t port = 0; + [self getHost:NULL port:&port family:NULL fromAddress:address]; + + return port; +} + ++ (int)familyFromAddress:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return af; +} + ++ (BOOL)isIPv4Address:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return (af == AF_INET); +} + ++ (BOOL)isIPv6Address:(NSData *)address +{ + int af = AF_UNSPEC; + [self getHost:NULL port:NULL family:&af fromAddress:address]; + + return (af == AF_INET6); +} + ++ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr fromAddress:(NSData *)address +{ + return [self getHost:hostPtr port:portPtr family:NULL fromAddress:address]; +} + ++ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr family:(int *)afPtr fromAddress:(NSData *)address +{ + if ([address length] >= sizeof(struct sockaddr)) + { + const struct sockaddr *addrX = (const struct sockaddr *)[address bytes]; + + if (addrX->sa_family == AF_INET) + { + if ([address length] >= sizeof(struct sockaddr_in)) + { + const struct sockaddr_in *addr4 = (const struct sockaddr_in *)(const void *)addrX; + + if (hostPtr) *hostPtr = [self hostFromSockaddr4:addr4]; + if (portPtr) *portPtr = [self portFromSockaddr4:addr4]; + if (afPtr) *afPtr = AF_INET; + + return YES; + } + } + else if (addrX->sa_family == AF_INET6) + { + if ([address length] >= sizeof(struct sockaddr_in6)) + { + const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)(const void *)addrX; + + if (hostPtr) *hostPtr = [self hostFromSockaddr6:addr6]; + if (portPtr) *portPtr = [self portFromSockaddr6:addr6]; + if (afPtr) *afPtr = AF_INET6; + + return YES; + } + } + } + + if (hostPtr) *hostPtr = nil; + if (portPtr) *portPtr = 0; + if (afPtr) *afPtr = AF_UNSPEC; + + return NO; +} + +@end diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.h b/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.h new file mode 100644 index 0000000..b2499a0 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.h @@ -0,0 +1,27 @@ +// +// XUDPClient.h +// xcmd +// +// Created by mac on 2025/2/17. +// + +#ifndef XUDPClient_h +#define XUDPClient_h + +#import + +#import "CocoaAsyncSocket.h" + +typedef void (^SendCallback) (NSString *msg); + +@interface XUDPClient : NSObject + +@property (nonatomic, copy) SendCallback hintBlock; + + ++(instancetype)sharedInstance; +- (void) onShow: (NSDictionary *)data; +- (void) onEnd: (NSDictionary *)data; +@end + +#endif /* XUDPClient_h */ diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.m b/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.m new file mode 100644 index 0000000..bab68ae --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/XUDPClient.m @@ -0,0 +1,143 @@ +// +// XUDPClient.m +// xcmd +// +// Created by mac on 2025/2/17. +// + +#import + +#import "XUDPClient.h" + +#define HOST @"127.0.0.1" +#define PORT 6001 + + +@interface XUDPClient() { +@private + GCDAsyncUdpSocket *_udpSocket; +} + +@end + + +@implementation XUDPClient ++(instancetype)sharedInstance +{ + static XUDPClient* _sharedInstance = nil; + static dispatch_once_t oncePredicate; + dispatch_once (&oncePredicate, ^{ + _sharedInstance = [[XUDPClient alloc] init]; + }); + return _sharedInstance; +} +-(instancetype)init { + if (self = [super init]) { + [self start]; + return self; + } + return nil; +} + +- (void) start +{ + if (!_udpSocket) + { + _udpSocket=nil; + } + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + _udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:queue]; + NSError *error = nil; + if (![_udpSocket bindToPort:0 error:&error]) + { + NSLog(@"Error binding: %@", error); + return; + } + if (![_udpSocket beginReceiving:&error]) + { + NSLog(@"Error receiving: %@", error); + return; + } +} +- (void) close +{ + if(_udpSocket) { + [_udpSocket closeAfterSending]; + } +} +- (NSString *)dic2Json: (NSDictionary *)dict { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict + options:NSJSONWritingPrettyPrinted + error:&error]; + if (error) { + NSLog(@"dic2json err:%@", error); + } + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; +} + +- (void) onShow: (NSDictionary *)data { + NSDictionary *rq = @{ + @"url": @"/adtask/show", + @"body": data + }; + [self send:[self dic2Json: rq]]; +} + +- (void) onEnd: (NSDictionary *)data { + NSDictionary *rq = @{ + @"url": @"/adtask/end", + @"body": data + }; + [self send:[self dic2Json: rq]]; +} + +- (void) send: (NSString*) msg { + NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding]; + [_udpSocket sendData:data toHost:HOST port:PORT withTimeout:-1 tag:300]; +} +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address +{ + NSError *error = nil; + NSLog(@"Message didConnectToAddress: %@",[[NSString alloc]initWithData:address encoding:NSUTF8StringEncoding]); + [_udpSocket beginReceiving:&error]; +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError *)error +{ + NSLog(@"Message didNotConnect: %@",error); +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error +{ + NSLog(@"Message didNotSendDataWithTag: %@",error); +} + +- (NSDictionary *) json2dic: (NSString *) jsstr { + NSError *jsonError; + NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[jsstr dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingMutableContainers + error:&jsonError]; + if (jsonError) { + NSLog(@"json2dic error: %@", jsonError); + } + return dic; +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext +{ + NSString *revDada =[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; + NSLog(@"Message didReceiveData :%@", revDada); + if(self.hintBlock) { + self.hintBlock(revDada); + } + +} + +-(void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag +{ + NSLog(@"Message 发送成功"); +} + + +@end diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_NetWorkManager.swift b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_NetWorkManager.swift new file mode 100644 index 0000000..a7d0fa5 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_NetWorkManager.swift @@ -0,0 +1,1362 @@ +// +// YL_NetWorkManager.swift +// wallpaper_project +// Created by 忆海16 on 2024/9/29. +// + +import Foundation +import UIKit +import AdSupport +import CoreTelephony +import Network +import SystemConfiguration +import AVFoundation +import OpenGLES +import AppTrackingTransparency +import CommonCrypto + + +/// <#Description#> +class YL_NetWorkManager{ + static var kBaseUrl = YL_NetWorkManager.bFaceLocalUrl() + + static var kURL_AD_Start = "/top_selection/save_app_start_log" + static var kURL_AD_Load = "/top_selection/save_ad_load_log" + static var kURL_AD_Show = "/top_selection/save_ad_show_log" + static var kURL_save_logs = "/ios/top_selection/save_iphone_logs" + + var ipLoadTime: DispatchTime? + + static var kLocalBaseUrl = BbbAdManager.config.adbrush_local_url + + + static var kLocalUrlStr: (String) -> String { + return { path in + return "\(self.kLocalBaseUrl)/\(path)" + } + } + + + static func bFaceLocalUrl() -> String { + + return BbbAdManager.config.adbrush_base_url + + } + + + + typealias LuxNetManagerCallback = (Error?, Bool, [String: Any]?) -> Void + + + + static func uploadData(mdic: [String: Any], urlPath: String, callback: @escaping (Error?, Bool, [String: Any]?) -> Void) { + guard let url = URL(string: urlPath) else { + print("Invalid URL") + return + } + + print("---------mdic \(mdic)") + + print("---------urlPath\(urlPath)") + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + do { + let data = try JSONSerialization.data(withJSONObject: mdic, options: []) + request.httpBody = data + } catch { + print("Error serializing JSON: \(error.localizedDescription)") + + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Error serializing JSON: \(error.localizedDescription)" + ]) + } + + return + } + + let task = URLSession.shared.dataTask(with: request) { (data, response, error) in + if let error = error { + callback(error, false, nil) + print("Network error: \(error.localizedDescription)") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Network error: \(error.localizedDescription)" + ]) + } + } else { + guard let data = data else { + callback(nil, false, nil) + print("No data received") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"No data received" + ]) + } + return + } + + do { + if let result = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { + print("Server response: \(result)") + callback(nil, true, result) + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Server response: \(result)" + ]) + } + + } + } catch { + callback(error, false, nil) + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: [ + "text":"Error parsing response JSON: \(error.localizedDescription)" + ]) + } + + + + print("Error parsing response JSON: \(error.localizedDescription)") + } + } + } + + task.resume() + } + + + // 请求远程IP + func requestRemoteIp() { + ipLoadTime = DispatchTime.now() + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "获取ip中..."]) + + guard let url = URL(string: "https://openapi.lux-ad.com/app/common/getIPInfo") else { return } + let request = URLRequest(url: url) + let task = URLSession.shared.dataTask(with: request) { data, response, error in + if let error = error { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + return + } + + guard let data = data, + let result = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], + let ip = result["data"] as? [String: Any], + let ipAddress = ip["ip"] as? String, + let isoCode = ip["isoCode"] as? String else { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + return + } + + if !ipAddress.isEmpty { + UserDefaults.standard.set(ipAddress, forKey: "kIP_key") + UserDefaults.standard.set(isoCode, forKey: "kIP_key_isoCode") + UserDefaults.standard.synchronize() + + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "当前ip: \(ipAddress) \n国家: \(isoCode) "]) + } + + if let startTime = self.ipLoadTime { + let loadDuration = self.IpcalculateElapsedTime(since: startTime) + BbbAdManager.config.ipTime = loadDuration + } + + } else { + print("解析ip失败....") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "解析ip失败...."]) + } + } + } + task.resume() + } + + + // 辅助函数以毫秒为单位计算经过的时间 + private func IpcalculateElapsedTime(since startTime: DispatchTime) -> Int { + let endTime = DispatchTime.now() + let nanoseconds = endTime.uptimeNanoseconds - startTime.uptimeNanoseconds + return Int(nanoseconds / 1_000_000) // 转换为毫秒 + } + + + // DeviceId + + static func getDeviceId() -> String { + var adbrushDeviceId = UserDefaults.standard.dictionary(forKey: "bfaceDictKey")?["adbrush_deviceid"] as? String + if adbrushDeviceId == nil { + adbrushDeviceId = UIDevice.current.identifierForVendor?.uuidString + var bfaceDict = UserDefaults.standard.dictionary(forKey: "bfaceDictKey") ?? [:] + bfaceDict["adbrush_deviceid"] = adbrushDeviceId + UserDefaults.standard.set(bfaceDict, forKey: "bfaceDictKey") + UserDefaults.standard.synchronize() + } + + return adbrushDeviceId ?? "" + } + + + // 本地IP + static func getLocalIp() -> String { + var address = "an error occurred when obtaining ip address" + var interfaces: UnsafeMutablePointer? = nil + + if getifaddrs(&interfaces) == 0 { + var tempAddr = interfaces + + while tempAddr != nil { + let addrFamily = tempAddr!.pointee.ifa_addr.pointee.sa_family + let name = String(cString: tempAddr!.pointee.ifa_name) + + if addrFamily == AF_INET && name == "en0" { + var ipAddress = sockaddr_in() + memcpy(&ipAddress, tempAddr!.pointee.ifa_addr, MemoryLayout.size) + address = String(cString: inet_ntoa(ipAddress.sin_addr)) + } + tempAddr = tempAddr!.pointee.ifa_next + } + freeifaddrs(interfaces) + } + return address + } + + + // 包名 + static func getPackageName() -> String { + return Bundle.main.bundleIdentifier ?? "" + } + + // 版本 + static func getappVersion() -> String { + + return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "" + + } + + // 手机型号 + static func getiphone() -> String { + + return UIDevice.current.localizedModel + + } + + // 系统版本 + static func getosVersion() -> String { + + return UIDevice.current.systemVersion + + } + + // 电池电量 + static func getBatteryLevel() -> Float? { + return UIDevice.current.batteryLevel + } + + // 是否在充电 + static func isDeviceCharging() -> Bool { + return UIDevice.current.batteryState == .charging || UIDevice.current.batteryState == .full + } + + // 获取deviceId + static func getPhoneDeviceId() -> String? { + return UIDevice.current.identifierForVendor?.uuidString + } + + // 当前的无线接入技术 + static func getCurrentRadioAccessTechnology() -> String? { + let networkInfo = CTTelephonyNetworkInfo() + let radioAccessTechnology = networkInfo.currentRadioAccessTechnology + return radioAccessTechnology + } + + + + // 时间 + static func getCurrentTime() -> String { + let date = Date() // 获取当前日期和时间 + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" // 设置日期格式 + formatter.locale = Locale(identifier: "en_US_POSIX") // 确保使用 ISO 8601 标准 + return formatter.string(from: date) + } + + // 字体 + static func getCurrentFont() -> String { + return "\(UIFont.systemFont(ofSize: UIFont.systemFontSize))" + } + + // 语言 + static func getlanguageCode() -> String { + return Locale.current.languageCode ?? "" + } + + + //GAID + + static func getGaid() -> String { + return ASIdentifierManager.shared().advertisingIdentifier.uuidString + } + + + // IDFA + static func getIdfa() -> String { + if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + return idfa + } else { + return "" + } + } + + // monotonicRawClockTimeMillis 单调时钟时间戳 + static func getMonotonicRawClockTimeMillis() -> UInt64 { + let time = mach_absolute_time() + let nanoseconds = Double(time) / Double(NSEC_PER_SEC) // Convert to nanoseconds + return UInt64(nanoseconds / 1000000) // Convert to milliseconds + } + + // 内核启动时间戳 + static func getKernelBootTimeMillis() -> Int64? { + // 定义变量以存储系统启动时间 + var bootTime = timeval() + var size = MemoryLayout.stride + + // 获取系统启动时间 + let mib: [Int32] = [CTL_KERN, KERN_BOOTTIME] + let result = sysctl(UnsafeMutablePointer(mutating: mib), 2, &bootTime, &size, nil, 0) + + guard result == 0 else { + print("获取系统启动时间失败") + return nil + } + + // 系统启动时间(秒 + 微秒) + let bootTimeInSeconds = Double(bootTime.tv_sec) + Double(bootTime.tv_usec) / 1_000_000 + + // 当前时间 + let currentTime = Date().timeIntervalSince1970 + + // 计算内核运行的时间(秒) + let kernelBootTimeInSeconds = currentTime - bootTimeInSeconds + + // 转换为毫秒 + return Int64(kernelBootTimeInSeconds * 1_000) + } + + + // 获取运营商信息 + static func getCarrierInfo() -> String { + var carrierInfo = "" + let networkInfo = CTTelephonyNetworkInfo() + let carrier = networkInfo.serviceSubscriberCellularProviders?.first?.value + if let carrier = carrier { + carrierInfo = "\(carrier.mobileCountryCode ?? "") \(carrier.mobileNetworkCode ?? "")" + } + return carrierInfo + } + + // 获取网络连接类型 + static func getNetworkType() -> String { + let monitor = NWPathMonitor() + let queue = DispatchQueue.global(qos: .background) + + var type:String = "" + + monitor.pathUpdateHandler = { path in + if path.status == .satisfied { + if path.usesInterfaceType(.wifi) { + type = "Wi-Fi" + } else if path.usesInterfaceType(.cellular) { + type = "Cellular" + } else if path.usesInterfaceType(.wiredEthernet) { + type = "Wired Ethernet" + } else if path.usesInterfaceType(.loopback) { + type = "Loopback" + } else { + type = "Other" + } + } else { + type = "Unavailable" + } + monitor.cancel() // 停止监控,释放资源 + } + + monitor.start(queue: queue) + return type + } + + // 是否连接VPN + static func isVPNOn() -> Bool { + var flag = false + let version = UIDevice.current.systemVersion + + // Check if the system version is >= 9.0 + if let versionDouble = Double(version), versionDouble >= 9.0 { + // For iOS 9.0 and above + if let dict = CFNetworkCopySystemProxySettings() as? Unmanaged { + let bridgedDict = dict.takeUnretainedValue() as? [String: Any] + + if let scopedSettings = bridgedDict?["__SCOPED__"] as? [String: Any] { + for key in scopedSettings.keys { + if key.contains("tap") || key.contains("tun") || key.contains("ipsec") || key.contains("ppp") { + flag = true + break + } + } + } + } + } else { + // For iOS versions below 9.0 + var interfaces: UnsafeMutablePointer? + let success = getifaddrs(&interfaces) + + if success == 0 { + var tempAddr = interfaces + while tempAddr != nil { + if let name = String(validatingUTF8: (tempAddr?.pointee.ifa_name)!) { + if name.contains("tap") || name.contains("tun") || name.contains("ipsec") || name.contains("ppp") { + flag = true + break + } + } + tempAddr = tempAddr?.pointee.ifa_next + } + } + + // Free memory + freeifaddrs(interfaces) + } + + return flag + } + + + + static func appId() -> String { + return Bundle.main.bundleIdentifier ?? "" + } + + + // 获取音量 + static func isDeviceMuted() -> Bool { + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setActive(true) + // 获取当前音量 + let currentVolume = audioSession.outputVolume + return currentVolume == 0 + } catch { + print("Error setting audio session active: \(error.localizedDescription)") + return false + } + } + + // 追踪状态 + static func getAdvertisingTrackingStatus() -> String { + if #available(iOS 14, *) { + switch ATTrackingManager.trackingAuthorizationStatus { + case .notDetermined: + return "notDetermined" + case .restricted: + return "restricted" + case .denied: + return "denied" + case .authorized: + return "authorized" + @unknown default: + return "unknown" + } + } else { + // iOS 14 以下版本 + let isTrackingEnabled = ASIdentifierManager.shared().isAdvertisingTrackingEnabled + return isTrackingEnabled ? "authorized" : "denied" + } + } + + // 是否启用追踪 + static func isAdvertisingTrackingEnabled() -> Bool { + if #available(iOS 14, *) { + switch ATTrackingManager.trackingAuthorizationStatus { + case .authorized: + return true // 用户允许广告追踪 + default: + return false // 用户未授权、受限制或拒绝 + } + } else { + // iOS 14 以下版本 + return ASIdentifierManager.shared().isAdvertisingTrackingEnabled + } + } + + // 获取设备总内存 + + static func getTotalMemoryInBytes() -> UInt64 { + return ProcessInfo.processInfo.physicalMemory + } + + static func getTotalMemoryInReadableFormat() -> String { + let totalMemoryBytes = getTotalMemoryInBytes() + let formatter = ByteCountFormatter() + formatter.allowedUnits = [.useGB] // 只显示为 GB + formatter.countStyle = .memory + return formatter.string(fromByteCount: Int64(totalMemoryBytes)) + } + + + // 是否是刘海屏 + static func isNotchScreen() -> Bool { + // 确保在主线程中访问 + if Thread.isMainThread { + guard let window = UIApplication.shared.windows.first else { return false } + let topSafeArea = window.safeAreaInsets.top + return topSafeArea > 20 + } else { + // 在非主线程中调用时,通过调度回主线程同步获取结果 + return DispatchQueue.main.sync { + guard let window = UIApplication.shared.windows.first else { return false } + let topSafeArea = window.safeAreaInsets.top + return topSafeArea > 20 + } + } + } + + + // 屏幕方向 + + static func getScreenOrientation() -> String { + let orientation = UIDevice.current.orientation + + switch orientation { + case .portrait: + return "portrait" + case .portraitUpsideDown: + return "portraitUpsideDown" + case .landscapeLeft: + return "landscapeLeft" + case .landscapeRight: + return "landscapeRight" + case .faceUp: + return "faceUp" + case .faceDown: + return "faceDown" + case .unknown: + return "unknown" + @unknown default: + return "unknown" + } + } + + // 获取 OpenGL版本 + static func getOpenGLVersion() -> String { + // 尝试初始化 OpenGL ES 3.0 上下文 + if let _ = EAGLContext(api: .openGLES3) { + return "openGLES3" + } + // 尝试初始化 OpenGL ES 2.0 上下文 + else if let _ = EAGLContext(api: .openGLES2) { + return "openGLES2" + } + // 如果上述都失败,则返回 OpenGL ES 1.0 + else if let _ = EAGLContext(api: .openGLES1) { + return "openGLES1" + } else { + return "NO OpenGL ES" + } + } + + // 获取时区偏移量 + static func getTimeZoneOffsetFromUS() -> Int { + // 获取当前设备的时区 + let currentTimeZone = TimeZone.current + + // 获取美国东部时间的时区(美区时区) + let usTimeZone = TimeZone(identifier: "America/New_York") + + // 获取两个时区的偏移量,单位为秒 + let currentOffset = currentTimeZone.secondsFromGMT() + let usOffset = usTimeZone?.secondsFromGMT() ?? 0 + + // 计算偏移差,并将结果转为分钟 + let offsetDifferenceInMinutes = (currentOffset - usOffset) / 60 + return offsetDifferenceInMinutes + } + + // 设备键盘类型 + static func getKeyboardLayoutType() -> [String] { + var keyboardLayouts: [String] = [] + + // 获取当前设备的语言环境 + let currentLanguage = Locale.current.languageCode ?? "" + + // 根据语言环境推测键盘布局类型 + switch currentLanguage { + case "en": + // 英语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "fr": + // 法语一般使用 AZERTY 布局 + keyboardLayouts.append("AZERTY") + case "de": + // 德语一般使用 QWERTZ 布局 + keyboardLayouts.append("QWERTZ") + case "es": + // 西班牙语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "it": + // 意大利语一般使用 QWERTY 布局 + keyboardLayouts.append("QWERTY") + case "ja": + // 日语一般使用日本输入法 + keyboardLayouts.append("Japanese") + case "zh": + // 中文一般使用拼音输入法 + keyboardLayouts.append("Pinyin") + default: + // 其他语言暂时返回 QWERTY + keyboardLayouts.append("QWERTY") + } + + return keyboardLayouts + } + + + // 设备型号修订版 + static func getDeviceHardwareIdentifier() -> String { + var size: Int = 0 // 使用 Int 类型而不是 UInt32 + sysctlbyname("hw.model", nil, &size, nil, 0) + + var model = [CChar](repeating: 0, count: size) + sysctlbyname("hw.model", &model, &size, nil, 0) + + let modelString = String(cString: model) + return modelString + } + + // static func mapHardwareIdentifierToModelNumber(_ identifier: String) -> String { + // switch identifier { + // // iPhone 系列 + // case "iPhone13,2": + // return "A2172" // iPhone 12 + // case "iPhone13,3": + // return "A2341" // iPhone 12 Pro + // case "iPhone13,4": + // return "A2342" // iPhone 12 Pro Max + // case "iPhone13,1": + // return "A2176" // iPhone 12 mini + // case "iPhone12,1": + // return "A2111" // iPhone 11 + // case "iPhone12,3": + // return "A2160" // iPhone 11 Pro + // case "iPhone12,5": + // return "A2161" // iPhone 11 Pro Max + // case "iPhone11,8": + // return "A1882" // iPhone XR + // case "iPhone11,2": + // return "A1920" // iPhone XS + // case "iPhone11,6": + // return "A1921" // iPhone XS Max + // case "iPhone10,3": + // return "A1865" // iPhone X + // case "iPhone10,6": + // return "A1901" // iPhone X + // case "iPhone9,1": + // return "A1660" // iPhone 7 + // case "iPhone9,2": + // return "A1661" // iPhone 7 Plus + // case "iPhone8,1": + // return "A1549" // iPhone 6s + // case "iPhone8,2": + // return "A1586" // iPhone 6s Plus + // case "iPhone7,1": + // return "A1522" // iPhone 6 Plus + // case "iPhone7,2": + // return "A1549" // iPhone 6 + // case "iPhone6,1": + // return "A1528" // iPhone 5s + // case "iPhone6,2": + // return "A1530" // iPhone 5s + // case "iPhone5,1": + // return "A1428" // iPhone 5 + // case "iPhone5,2": + // return "A1429" // iPhone 5 + // + // // iPad 系列 + // case "iPad8,1": + // return "A1893" // iPad Air 3 + // case "iPad8,2": + // return "A1894" // iPad Air 3 + // case "iPad8,3": + // return "A1954" // iPad Pro 10.5" + // case "iPad8,4": + // return "A1955" // iPad Pro 10.5" + // case "iPad8,5": + // return "A1701" // iPad Pro 12.9" (2nd generation) + // case "iPad8,6": + // return "A1709" // iPad Pro 12.9" (2nd generation) + // case "iPad8,7": + // return "A1673" // iPad Pro 12.9" (3rd generation) + // case "iPad8,8": + // return "A1674" // iPad Pro 12.9" (3rd generation) + // + // // iPad Mini 系列 + // case "iPad4,4": + // return "A1454" // iPad Mini 2 + // case "iPad4,5": + // return "A1455" // iPad Mini 2 + // case "iPad4,6": + // return "A1456" // iPad Mini 2 + // case "iPad5,1": + // return "A1822" // iPad Mini 4 + // case "iPad5,2": + // return "A1823" // iPad Mini 4 + // + // // iPad Pro 系列 + // case "iPad6,7": + // return "A1652" // iPad Pro 12.9" (1st generation) + // case "iPad6,8": + // return "A1670" // iPad Pro 12.9" (1st generation) + // case "iPad7,1": + // return "A1674" // iPad Pro 12.9" (2nd generation) + // case "iPad7,2": + // return "A1673" // iPad Pro 12.9" (2nd generation) + // + // // Apple Watch 系列 + // case "Watch1,1": + // return "A1554" // Apple Watch (1st generation) + // case "Watch1,2": + // return "A1553" // Apple Watch (1st generation) + // case "Watch2,6": + // return "A1792" // Apple Watch Series 1 + // case "Watch2,7": + // return "A1791" // Apple Watch Series 1 + // case "Watch3,1": + // return "A1860" // Apple Watch Series 3 + // case "Watch3,2": + // return "A1861" // Apple Watch Series 3 + // case "Watch3,3": + // return "A1889" // Apple Watch Series 3 + // case "Watch3,4": + // return "A1890" // Apple Watch Series 3 + // case "Watch4,1": + // return "A1975" // Apple Watch Series 4 + // case "Watch4,2": + // return "A1976" // Apple Watch Series 4 + // case "Watch4,3": + // return "A1977" // Apple Watch Series 4 + // case "Watch4,4": + // return "A1978" // Apple Watch Series 4 + // + // // Apple TV 系列 + // case "AppleTV5,3": + // return "A1469" // Apple TV (4th generation) + // case "AppleTV6,2": + // return "A1842" // Apple TV 4K (1st generation) + // case "AppleTV11,1": + // return "A2169" // Apple TV 4K (2nd generation) + // default: + // return "Unknown model" + // } + // } + + + +// static func uploadAD_Load(adid:String,ecpm:Double,network:String,countryCode:String,platformResponseTime:TimeInterval,dsp:String,loadTime:Int){ +// +// var mdic: [String: Any] = [:] +// +// mdic["deviceId"] = starManager.shared.adbrush_deviceid +// mdic["gaid"] = self.getGaid() +// mdic["localIp"] = starManager.shared.adbrush_localip +// +// // let remoteIp = UserDefaults.standard.string(forKey: "kIP_key") ?? "" +// mdic["remoteIp"] = starManager.shared.remouteIP +// +// mdic["packageName"] = appId() +// mdic["adPlatform"] = "MAX" +// mdic["countryCode"] = countryCode +// mdic["adId"] = adid +// mdic["platformResponseTime"] = platformResponseTime +// mdic["shelfNumber"] = "uploadAD_Load" +// mdic["ecpm"] = ecpm +// mdic["getIpResponseTime"] = starManager.shared.ipTime +// mdic["dsp"] = dsp +// mdic["dataId"] = starManager.shared.dataId +// mdic["linkId"] = starManager.shared.linkId +// mdic["loadTime"] = loadTime +// mdic["succeed"] = true +// mdic["network"] = network +// mdic["online"] = false +// mdic["washParam"] = starManager.shared.washParam +// +// // Log the JSON data to verify it's correctly formatted +// do { +// let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) +// let jsonString = String(data: jsonData, encoding: .utf8) ?? "" +// print("Uploading AD Show with data: \(jsonString)") +// +// DispatchQueue.main.sync { +// NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "uploadAD_Load:\n\(jsonString)"]) +// } +// +// +// YL_NetWorkManager.uploadData(mdic: mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Load)") { err, state, result in +// if let error = err { +// print("Error: \(error.localizedDescription)") +// } else { +// print("Result: \(result ?? [:])") +// DispatchQueue.main.async { +// NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "AdID: \(adid) 广告加载成功, ecpm: \(ecpm) 加载时长: 0ms dsp: \( "MAX") network: \(network)"]) +// } +// +// } +// } +// +// +// } catch { +// print("Error serializing JSON: \(error.localizedDescription)") +// } +// +// +// } + + static func uploadAD_Load( + adid: String, + ecpm: Double, + network: String, + countryCode: String, + platformResponseTime: TimeInterval, + dsp: String, + loadTime: Int, + retryCount: Int = 3, // 默认重试3次, + errMsg:String = "" + ) { + var mdic: [String: Any] = [:] + + mdic["deviceId"] = BbbAdManager.config.adbrush_deviceid + mdic["gaid"] = self.getGaid() + mdic["localIp"] = BbbAdManager.config.adbrush_localip + mdic["remoteIp"] = BbbAdManager.config.remouteIP + mdic["packageName"] = appId() + mdic["adPlatform"] = "TopOn" + mdic["countryCode"] = countryCode + mdic["adId"] = adid + mdic["platformResponseTime"] = platformResponseTime + mdic["shelfNumber"] = "uploadAD_Load" + mdic["ecpm"] = ecpm + mdic["getIpResponseTime"] = BbbAdManager.config.ipTime + mdic["dsp"] = dsp + mdic["dataId"] = BbbAdManager.config.dataId + mdic["linkId"] = BbbAdManager.config.linkId + mdic["loadTime"] = loadTime + mdic["succeed"] = true + mdic["network"] = network + mdic["online"] = false + mdic["washParam"] = BbbAdManager.config.washParam + if !errMsg.isEmpty { + mdic["succeed"] = false + mdic["errorMsg"] = errMsg + } + + // Log the JSON data to verify it's correctly formatted + do { + let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + NSLog("XS- Uploading AD Show with data: \(jsonString)") + + + + // 上传数据 + YL_NetWorkManager.uploadData(mdic: mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Load)") { err, state, result in + if let error = err { + NSLog("XS- Error: \(error.localizedDescription)") + + if retryCount > 0 { + NSLog("XS- Retrying... Remaining attempts: \(retryCount - 1)") + // 延迟1秒后重试 + DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + 1.0) { + uploadAD_Load( + adid: adid, + ecpm: ecpm, + network: network, + countryCode: countryCode, + platformResponseTime: platformResponseTime, + dsp: dsp, + loadTime: loadTime, + retryCount: retryCount - 1 + ) + } + } else { + NSLog("XS- Failed to upload data after \(3 - retryCount) retries.") + } + } else { + NSLog("XS- Result: \(result ?? [:])") + } + } + } catch { + NSLog("XS- Error serializing JSON: \(error.localizedDescription)") + } + } + + + + static func uploadAD_Show(adid:String,ecpm:Double,network:String,countryCode:String,platformResponseTime:TimeInterval,dsp:String){ + + var mdic: [String: Any] = [:] + + mdic["deviceId"] = BbbAdManager.config.adbrush_deviceid + mdic["gaid"] = self.getGaid() + mdic["localIp"] = BbbAdManager.config.adbrush_localip + + // let remoteIp = UserDefaults.standard.string(forKey: "kIP_key") ?? "" + mdic["remoteIp"] = BbbAdManager.config.remouteIP + + mdic["packageName"] = appId() + mdic["adPlatform"] = "TopOn" + mdic["countryCode"] = countryCode + mdic["adId"] = adid + mdic["platformResponseTime"] = platformResponseTime + mdic["shelfNumber"] = "uploadAD_Load" + mdic["ecpm"] = ecpm + mdic["getIpResponseTime"] = BbbAdManager.config.ipTime + mdic["dsp"] = dsp + mdic["dataId"] = BbbAdManager.config.dataId + mdic["linkId"] = BbbAdManager.config.linkId + mdic["loadTime"] = 0 + mdic["succeed"] = true + mdic["network"] = network + mdic["online"] = false + + do { + // Log the JSON data to verify it's correctly formatted + let jsonData = try JSONSerialization.data(withJSONObject: mdic, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + NSLog("XS- Uploading AD Show with data: \(jsonString)") + YL_NetWorkManager.uploadData(mdic:mdic, urlPath: "\(kBaseUrl)\(kURL_AD_Show)") { (err, state, result) in + if let error = err { + NSLog("XS- Error uploading AD Show: \(error.localizedDescription)") + } else { + NSLog("XS- Upload AD Show response: \(result ?? [:])") + } + } + } catch { + NSLog("XS- Error serializing JSON: \(error.localizedDescription)") + } + + + } + + + + /* + + static func showAd(idfa: String, + adId: String, + ecpm: Double?, + ad: Bool) { + + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["ecpm"] = ecpm ?? 0 + mdic["ad"] = ad + mdic["id"] = adId + + uploadData(mdic: mdic, urlPath: kLocalUrlStr("adtask/show")) { err, state, result in + guard let status = result?["status"] as? String, + let time = result!["close"] as? NSNumber else { + + return + } + + if status == "Success" && ad { + + closeAD.removeADVC(byDelayTime: time.intValue) + // closeWindows.removeADVCByDelayTime(time.intValue) + } + DispatchQueue.main.async { + + NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: ["info": "showAd,已上传展示AD操作,\(time.intValue / 1000)秒后关闭"]) + } + + if ad { + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adNetwork"), object: nil, userInfo: [ + "info": "AdID:\(adId),广告开始展示,展示时长\(time)" + ]) + } + } + } + } + */ + static func convertStringToDictionary(text: String) -> [String:AnyObject]? { + if let data = text.data(using: String.Encoding.utf8) { + do { + return try JSONSerialization.jsonObject(with: data, options: [JSONSerialization.ReadingOptions.init(rawValue: 0)]) as? [String:AnyObject] + } catch let error as NSError { + print(error) + } + } + return nil + } + + static func showAd(adId: String, + ecpm: Double?, + ad: Bool, + callback: @escaping () -> Void) { + + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["ecpm"] = ecpm ?? 0 + mdic["ad"] = ad + mdic["id"] = adId + + let client:XUDPClient = XUDPClient.sharedInstance() + client.hintBlock = { (t:String?) in + guard let jsonStr = t else { + return + } + let result = convertStringToDictionary(text: jsonStr) + guard let status = result?["status"] as? String, + let time = result!["close"] as? NSNumber else { + + return + } + + if status == "Success" && ad { + + initializationTopOn.removeADVC(byDelayTime: time.intValue, onclose:{ + callback(); + } ) + // closeWindows.removeADVCByDelayTime(time.intValue) + } + + } + + client.onShow(mdic); + } + static func loadend(max_ecpm:Double){ + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["max_ecpm"] = max_ecpm + + let client:XUDPClient = XUDPClient.sharedInstance() + client.hintBlock = { (t:String?) in + guard let jsonStr = t else { + return + } + let result = convertStringToDictionary(text: jsonStr) + + // 解析返回的 JSON 数据 + if let resultDict = result, + let status = resultDict["status"] as? String, + let restart = resultDict["restart"] as? Bool { + + // 打印返回的状态 + print("状态: \(status)") + + if restart { + // 如果 restart 为 true,重新加载广告 + print("重新加载广告展示") + // BbbAdManager.config.isadload = 0 + // 调用广告加载的函数 + + + // starManager.shared.isadsureshow = true + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "重新加载广告展示"]) + } + + + } else { + // restart 为 false,不需要处理 + print("不需要重新加载广告,程序后续会被杀掉") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "不需要重新加载广告,程序后续会被杀掉"]) + } + } + } else { + print("返回数据格式错误") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "返回数据格式错误"]) + } + } + } + + client.onEnd(mdic); + } + + /* + static func loadend(max_ecpm:Double){ + var mdic = [String: Any]() + mdic["appid"] = appId() + mdic["idfa"] = getIdfa() + mdic["max_ecpm"] = max_ecpm + + uploadData(mdic: mdic, urlPath:kLocalUrlStr("adtask/end")) { err, state, result in + // 检查是否有错误 + guard err == nil else { + print("请求失败: \(String(describing: err))") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "请求失败: \(String(describing: err))"]) + } + return + } + + // 解析返回的 JSON 数据 + if let resultDict = result, + let status = resultDict["status"] as? String, + let restart = resultDict["restart"] as? Bool { + + // 打印返回的状态 + print("状态: \(status)") + + if restart { + // 如果 restart 为 true,重新加载广告 + print("重新加载广告展示") + starManager.shared.isadload = 0 + // 调用广告加载的函数 + + for (index, adId) in starManager.shared.adids.enumerated() { + DispatchQueue.main.asyncAfter(deadline: .now() + Double(index) * 2) { // 每隔 4 秒加载一个广告 + YL_AdManager.shared.addInterstitialAdItem(adId: adId) + } + } + starManager.shared.isadsureshow = true + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "重新加载广告展示"]) + } + + + } else { + // restart 为 false,不需要处理 + print("不需要重新加载广告,程序后续会被杀掉") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "不需要重新加载广告,程序后续会被杀掉"]) + } + } + } else { + print("返回数据格式错误") + DispatchQueue.main.async { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "返回数据格式错误"]) + } + } + } + + } + + */ + + + static func saveIphonelogs() { + let processInfo = ProcessInfo.processInfo + let screenSize = UIScreen.main.bounds.size + let width = Int(screenSize.width) + let height = Int(screenSize.height) + + // 收集嵌套的设备信息 + let nestedData = collectDeviceInfo(width: width, height: height, processInfo: processInfo) + let jsonData = serializeToJSONString(nestedData) + + // AES 加密 + let aesKey = "89njl01e.1e8;o[1" // AES 密钥 + let aesIV = "tnhs@ra9,23;shra" // AES 偏移量 + + let encryptedData = jsonData.aesEncrypt(key: aesKey, iv: aesIV) + print("Encrypted text: \(encryptedData ?? "" )") + + if let decrypted = encryptedData?.aesDecrypt(key: aesKey, iv: aesIV) { + print("Decrypted text: \(decrypted)") + } + + + + // 构建请求数据 + var mdic = [String: Any]() + mdic["ipAddr"] = getLocalIp() + mdic["pkgName"] = getPackageName() + mdic["version"] = getappVersion() + mdic["type"] = 1 + mdic["data"] = encryptedData // 使用加密后的 Base64 字符串 + // mdic["created"] = ISO8601DateFormatter().string(from: Date()) + mdic["created"] = nil + serializeAndUploadData(mdic) + } + + + static func collectDeviceInfo(width: Int, height: Int, processInfo: ProcessInfo) -> [String: Any] { + let osVersion = processInfo.operatingSystemVersion + let osVersionString = "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)" + + return [ + "deviceModel": getIpne.shard.getIPhoneModel().getName(), + "osVersion": getosVersion(), + "batteryLevel": getBatteryLevel() ?? 0.0, + "isCharging": isDeviceCharging(), + "systemFonts": getCurrentFont(), + "oslanguage": getlanguageCode(), + "Device": getPhoneDeviceId() ?? "", + "processID": processInfo.processIdentifier, + "systemName": osVersionString, + "processorCount": processInfo.processorCount, + "physicalMemory": Double(processInfo.physicalMemory) / 1024.0 / 1024.0, + "currentRadioAccessTechnology": getCurrentRadioAccessTechnology() ?? "", + "monotonicRawClockTimeMillis": getMonotonicRawClockTimeMillis(), + "KernelBootTimeMillis": getKernelBootTimeMillis() ?? 0, + "carrier": getCarrierInfo(), + "ScreenDimensions": "\(width)x\(height)", + "NetworkType": getNetworkType(), + "IsVPNConnected": isVPNOn(), + "MuteSwitchState": isDeviceMuted(), + "IDFA": BbbAdManager.config.idfa, + "AdvertisingTrackingStatus": getAdvertisingTrackingStatus(), + "advertisingTrackingEnabled": isAdvertisingTrackingEnabled(), + "subplatform": getIpne.shard.getIPhoneModel().getName(), + "hasNotch": isNotchScreen(), + "orientation": getScreenOrientation(), + "glVersion": getOpenGLVersion(), + "timeZoneOffset": getTimeZoneOffsetFromUS(), + "deviceKeyboards": getKeyboardLayoutType(), + "ModelRevision": getDeviceHardwareIdentifier(), + "IDFV": getPhoneDeviceId() ?? "", + ] + } + + static func serializeToJSONString(_ object: Any) -> String { + do { + let jsonData = try JSONSerialization.data(withJSONObject: object, options: []) + return String(data: jsonData, encoding: .utf8) ?? "{}" + } catch { + print("Error serializing object to JSON string: \(error.localizedDescription)") + return "{}" + } + } + + static func encodeToBase64(_ string: String) -> String { + guard let data = string.data(using: .utf8) else { return "" } + return data.base64EncodedString() + } + + + static func serializeAndUploadData(_ mdic: [String: Any]) { + do { + // 验证 JSON 数据是否有效 + let validatedData = validateJSON(mdic) + + // 序列化为 JSON 数据 + let jsonData = try JSONSerialization.data(withJSONObject: validatedData, options: .prettyPrinted) + let jsonString = String(data: jsonData, encoding: .utf8) ?? "" + print("save_iphone_logs with data: \(jsonString)") + + + + // 上传网络请求 + YL_NetWorkManager.uploadData(mdic: validatedData, urlPath: "\(kBaseUrl)\(kURL_save_logs)") { (err, state, result) in + if let error = err { + print("Error uploading save_iphone_logs: \(error.localizedDescription)") + } else { + print("save_iphone_logs response: \(result ?? [:])") + } + } + } catch { + print("Error serializing JSON save_iphone_logs: \(error.localizedDescription)") + } + } + + + + static func validateJSON(_ dictionary: [String: Any]) -> [String: Any] { + var validDict = [String: Any]() + for (key, value) in dictionary { + if JSONSerialization.isValidJSONObject([key: value]) { + validDict[key] = value + } else { + print("Invalid JSON value for key \(key): \(value)") + validDict[key] = "\(value)" // 将不支持的值转换为字符串 + } + } + return validDict + } + +} + + + +extension String { + func aesEncrypt(key: String, iv: String) -> String? { + guard let data = self.data(using: .utf8), + let encryptedData = data.aesEncrypt(key: key, iv: iv) else { return nil } + return encryptedData.base64EncodedString() + } + + func aesDecrypt(key: String, iv: String) -> String? { + guard let data = Data(base64Encoded: self), + let decryptedData = data.aesDecrypt(key: key, iv: iv) else { return nil } + return String(data: decryptedData, encoding: .utf8) + } +} + +extension Data { + func aesEncrypt(key: String, iv: String) -> Data? { + return self.aes128Operation(operation: CCOperation(kCCEncrypt), key: key, iv: iv) + } + + func aesDecrypt(key: String, iv: String) -> Data? { + return self.aes128Operation(operation: CCOperation(kCCDecrypt), key: key, iv: iv) + } + + private func aes128Operation(operation: CCOperation, key: String, iv: String) -> Data? { + guard key.count == kCCKeySizeAES128, iv.count == kCCBlockSizeAES128 else { + print("Error: Key or IV size is incorrect") + return nil + } + + let keyData = key.data(using: .utf8)! + let ivData = iv.data(using: .utf8)! + var outLength = Int(0) + var outBytes = [UInt8](repeating: 0, count: self.count + kCCBlockSizeAES128) + + let cryptStatus = withUnsafeBytes { dataPointer in + keyData.withUnsafeBytes { keyPointer in + ivData.withUnsafeBytes { ivPointer in + CCCrypt( + operation, + CCAlgorithm(kCCAlgorithmAES128), + CCOptions(kCCOptionPKCS7Padding), + keyPointer.baseAddress, kCCKeySizeAES128, + ivPointer.baseAddress, + dataPointer.baseAddress, self.count, + &outBytes, outBytes.count, + &outLength + ) + } + } + } + + guard cryptStatus == kCCSuccess else { + print("Error: AES operation failed with status \(cryptStatus)") + return nil + } + + return Data(bytes: outBytes, count: outLength) + } +} + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.swift b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.swift new file mode 100644 index 0000000..436d34e --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.swift @@ -0,0 +1,155 @@ +// +// YL_PlayVC.swift +// playbtest +// +// Created by 忆海16 on 2024/11/5. +// + +import UIKit +import AnyThinkInterstitial +class YL_PlayVC: UIViewController { + + @IBOutlet weak var textSDKView: UITextView! + @IBOutlet weak var bundleIdLab: UILabel! + @IBOutlet weak var deviceIdLab: UILabel! + @IBOutlet weak var ipLab: UILabel! + @IBOutlet weak var idfaLab: UILabel! + @IBOutlet weak var ad1Lab: UILabel! + @IBOutlet weak var ad2Lab: UILabel! + @IBOutlet weak var ad3Lab: UILabel! + + private var observation: NSKeyValueObservation? + + private var observationis: NSKeyValueObservation? + + var openADTimer:Timer? + let kOpenADPerSec: CGFloat = 0.1 // 假设的秒数 + let kOpenAdCTimeLength: CGFloat = 30 // 假设的超时时长 + + static var totalTimeC: CGFloat = 0.0 + var firstShow = true + + override func viewDidLoad() { + super.viewDidLoad() + + BbbAdManager.shared.loadAd(view:self) + let bundleId = Bundle.main.bundleIdentifier ?? "" + bundleIdLab.text = "Name:\(bundleId)" + let deviceId = BbbAdManager.config.adbrush_deviceid ?? "" + deviceIdLab.text = "DeviceID:\(deviceId)" + let locIp = BbbAdManager.config.adbrush_localip ?? "" + let remoteIp = BbbAdManager.config.remouteIP + ipLab.text = "LocIP:\(locIp),RemoteIp:\(remoteIp)" + + if #available(iOS 14, *) { + IDFA.shared.checkATT { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + self.idfaLab.text = "IDFA:\(idfa)" + } else { + print("无法获取 IDFA") + } + } + } else { + IDFA.shared.getIDFAForOlderVersions { idfa in + if let idfa = idfa { + print("IDFA: \(idfa)") + self.idfaLab.text = "IDFA:\(idfa)" + } else { + print("无法获取 IDFA") + } + } + } + + BbbAdManager.shared.start() + + + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + if (!firstShow) { + return + } + firstShow = false + + ad1Lab.text = BbbAdManager.config.adids[0] + ad2Lab.text = BbbAdManager.config.adids[1] + ad3Lab.text = BbbAdManager.config.adids[2] + + + self.navigationController?.navigationBar.isHidden = true + + NotificationCenter.default.addObserver(self, selector: #selector(addTextToTextView), name: NSNotification.Name("adinfo"), object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(adStatusChange), name: NSNotification.Name("adStatus"), object: nil) + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "adbrush_base_url:\(BbbAdManager.config.adbrush_base_url),adbrush_deviceid:\(String(describing: BbbAdManager.config.adbrush_deviceid)),adbrush_localip:\(String(describing: BbbAdManager.config.adbrush_localip)),adbrush_local_url:\(BbbAdManager.config.adbrush_local_url),adbrush_ecpm:\(BbbAdManager.config.adbrush_ecpm)"]) + } + + @objc func addTextToTextView(notification: Notification) { + if let newText = notification.userInfo?["text"] as? String { + // 正确的方式 + DispatchQueue.global().async { + // 后台线程处理数据 + + + DispatchQueue.main.async { + // 主线程更新UI + self.textSDKView.text.append("\(newText)\n\n") + } + } + + } + } + + + + + + + // 向文本末尾追加 100 行空白行 + func appendExtraLines1() { + let extraLines = String(repeating: "\n", count: 100) + let currentText = textSDKView.text ?? "" + + // 检查末尾是否已经有额外行,避免重复追加 + if !currentText.hasSuffix(extraLines) { + textSDKView.text = currentText.trimmingCharacters(in: .whitespacesAndNewlines) + extraLines + } + } + + + + + + + @objc func adStatusChange(notification: Notification) { + if let newText = notification.userInfo?["text"] as? String, let id = notification.userInfo?["id"] as? String { + var lab = ad1Lab + if id == BbbAdManager.config.adids[1] { + lab = ad2Lab + } else if id == BbbAdManager.config.adids[2] { + lab = ad3Lab + } + DispatchQueue.global().async { + // 后台线程处理数据 + + DispatchQueue.main.async { + // 主线程更新UI + lab?.text = "\(id):\(newText)" } + } + + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + +} + +extension Notification.Name { + static let adStatusChanged = Notification.Name("adStatusChanged") + +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.xib b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.xib new file mode 100644 index 0000000..b5f25b5 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/YL_PlayVC.xib @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/bbbAdManager.swift b/topon/template/PlayBTopOn/PlayBTopOn/playB/bbbAdManager.swift new file mode 100644 index 0000000..d354319 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/bbbAdManager.swift @@ -0,0 +1,549 @@ +// +// bbbAdManager.swift +// playbtest +// +// Created by mac on 2025/3/11. +// + +import Foundation +import AnyThinkInterstitial +import AnyThinkSDK + +class bConfig: NSObject { + var appId:String = "{appId}" + /// 广告Key + var adKey:String = "{adKey}" + + /// 广告数组 + var allAdIds:[String] = [{allAdIds}] + /// 广告数组 + var adids:[String] = [] + ///设备ID + var adbrush_deviceid:String? + ///最低ecpm + var adbrush_ecpm:Double = 0.0005 + /// 本地ip + var adbrush_localip:String? + /// A面load show + var adbrush_base_url:String = "http://192.168.9.11:8080" + /// 本地服务 + var adbrush_local_url:String = "http://127.0.0.1:6000" + + /// 远程ip + var remouteIP:String = "" + /// dataId + var dataId:String = "" + + ///IDFA + var idfa:String = "" + + + + /// + var washParam:Bool = false + /// + var linkId:String = "" + + ///load次数 + var loadcount:Int = 0 + ///load次数 + var loadcount1:Int = 0 + + var ipTime:Int = 0 + + override init() { + super.init() + + if self.allAdIds.count > 3 { + self.adids = Array(self.allAdIds.shuffled().prefix(3)) + } else { + self.adids = self.allAdIds + } + + } + + ///是否正在展示中 + @objc dynamic var isadsureshow:Bool = false + + + func getRandomString() -> String? { + return adids.randomElement() + } + // 判断当前是否为广告不量模式 + func isADSSMode() -> Bool { + // return true + return UserDefaults.standard.bool(forKey: "kLuxSSFaceKey") + } +} + +class AdItem :NSObject, ATInterstitialDelegate { + + + func didFinishLoadingAD(withPlacementID placementID: String!) { + BbbAdManager.config.loadcount1 += 1 + NSLog("XS- didFinishLoadingAD\(String(describing: placementID))") + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载广告1: \(String(describing: placementID)) 成功 - \(BbbAdManager.config.loadcount1)"]) + changeStatus(st: 2) + } + + + // var interstitialAd:MAInterstitialAd! + var interstitialAdID: String = "" + + var retryAttempt = 0.0 + + // 定义广告关闭后的操作闭包 + var _onAdClosed: (() -> Void)? + var onStatusChange:((_:String,_:Int, _:Double) -> Void)? + + var startLoadTime: DispatchTime? + + // 0: 初始,1:加载中,2:加载完成,3:展示中,4:关闭,5:加载失败,6:展示失败 + private(set) var status: Int = 0 + + private(set) var ecpm:Double = 0.0 + + + init(adID:String){ + + super.init() + self.interstitialAdID = adID + // loadInterstitialAd() + + } + func onAdClosed() { + if self._onAdClosed != nil { + self._onAdClosed!() + } + } + + func changeStatus(st:Int) { + self.status = st + onStatusChange?(self.interstitialAdID, st, self.ecpm) + } + + + func loadInterstitialAd(){ + NSLog("XS- placementIDLoad 1: ---- \(interstitialAdID)") + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text":"begin load:\(interstitialAdID)"]) + + startLoadTime = DispatchTime.now() + changeStatus(st: 1) + let extra: [String: Any] = [ + kATAdLoadingExtraMediaExtraKey: "custom_values" + ] + + ATAdManager.shared().loadAD(withPlacementID: interstitialAdID, extra: extra, delegate: self) + NSLog("XS- placementIDLoad 2: ---- \(interstitialAdID)") + + } + + + func showAd(viewController:UIViewController, onAdClosed: @escaping () -> Void) -> Bool{ + self._onAdClosed = onAdClosed + NSLog("XS- onAdClosed set: \(self._onAdClosed != nil)") + if ATAdManager.shared().interstitialReady(forPlacementID: interstitialAdID) { + ATAdManager.shared().showInterstitial(withPlacementID: interstitialAdID, in: viewController, delegate: self) + NSLog("XS- placementIDShow : ---- \(interstitialAdID)") + return true + } else { + NSLog("XS- interstitialAdID no redy 插页广告尚未准备好") +// retryLoadAdIfNecessary() + } + return false + } + + func to_network(_ network: Int) -> String { + switch network { + case 6: + return "Mintegral" + case 11: + return "Ironsource" + case 12: + return "UnityAds" + case 13: + return "Vungle" + case 50: + return "Pangle" + default: + return "Mintegral" + } + } + + + // 完成加载广告 + func didFinishBiddingADSource(withPlacementID placementID: String!,extra: [AnyHashable : Any]?) { + + BbbAdManager.config.loadcount += 1 + + + var thatecpm = 0.0 + if let adsourcePriceValue = extra?["adsource_price"] as? NSNumber { + thatecpm = Double(Float(truncating: adsourcePriceValue) / 1000) + } else { + NSLog("XS- not get type adsource_price or type not match") + } + if thatecpm > self.ecpm { + self.ecpm = thatecpm + } + NSLog("XS- ad load ok:\(BbbAdManager.config.linkId) - \(String(describing: placementID)) ecpm:\(self.ecpm * 1000)") + // 计算并打印加载时间 + var time = 0 + if let startTime = startLoadTime { + let loadDuration = calculateElapsedTime(since: startTime) + NSLog("XS- ad \(String(describing: placementID)) load time: \(loadDuration) ms") + time = loadDuration + } + + let networkID:Int = extra?["network_firm_id"] as! Int + let network = to_network(networkID) + let country = extra?["country"] ?? "" + + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载广告: \(String(describing: placementID)) 成功 - \(network), ecpm:\(String(format: "%.2f", self.ecpm * 1000)) \(country) \(BbbAdManager.config.loadcount)"]) + retryAttempt = 0 // 重置重试次数 + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Load(adid: placementID, ecpm: thatecpm , network: network, countryCode: country as! String, platformResponseTime: TimeInterval(time/1000) , dsp: "MTG", loadTime: time) + } + // 发布广告加载成功通知 + // NotificationCenter.default.post(name: .adDidLoad, object: nil, userInfo: ["adId": ad.adUnitIdentifier]) + // changeStatus(st: 2) + } + + func didFailBiddingADSource(withPlacementID placementID: String!,extra: [AnyHashable : Any]?, error: (any Error)!) { + // BbbAdManager.config.loadcount += 1 + NSLog("XS- load \(String(describing: placementID)) err.... :\(String(describing: error))") + /* + var time = 0 + + if let startTime = startLoadTime { + let loadDuration = calculateElapsedTime(since: startTime) + NSLog("XS- ad \(String(describing: placementID)) load time: \(loadDuration) ms") + time = loadDuration + } + + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Load(adid: placementID, ecpm: 0.0 , network: "", countryCode: "", platformResponseTime: TimeInterval(time/1000) , dsp: "MTG", loadTime: time,errMsg: "\(String(describing: error))") + } + */ + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "bidding error:\(String(describing: placementID) ),\(String(describing: error)) 失败"]) + // self.onAdClosed() + // changeStatus(st: 5) + } + + func didFailToLoadAD(withPlacementID placementID: String!, error: (any Error)!) { + BbbAdManager.config.loadcount += 1 + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载:\(String(describing: placementID) ),\(String(describing: error)) 失败"]) + NSLog("XS- load\(String(describing: placementID)) err.... :\(String(describing: error))") + // NotificationCenter.default.post(name: .adDidFailToLoad, object: nil, userInfo: ["adId": adUnitIdentifier]) + var time = 0 + if let startTime = startLoadTime { + let loadDuration = calculateElapsedTime(since: startTime) + NSLog("XS- ad \(String(describing: placementID)) load time: \(loadDuration) ms") + time = loadDuration + } + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Load(adid: placementID, ecpm: 0.0 , network: "", countryCode: "", platformResponseTime: TimeInterval(time/1000) , dsp: "MTG", loadTime: time,errMsg: "\(String(describing: error))") + } + // self.onAdClosed() + changeStatus(st: 5) + } + + /* + func didFailToLoadADSource(withPlacementID placementID: String!,extra: [AnyHashable : Any]?, error: (any Error)!) { + BbbAdManager.config.loadcount += 1 + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "加载:\(String(describing: placementID) ),\(String(describing: error)) 失败"]) + NSLog("XS- load\(String(describing: placementID)) err.... :\(String(describing: error))") + // NotificationCenter.default.post(name: .adDidFailToLoad, object: nil, userInfo: ["adId": adUnitIdentifier]) + var thatecpm = 0.0 + if let adsourcePriceValue = extra?["adsource_price"] as? NSNumber{ + thatecpm = Double(Float(truncating: adsourcePriceValue) / 1000) + } else { + NSLog("XS- not get type adsource_price or type not match") + } + // self.ecpm = thatecpm + + // 计算并打印加载时间 + var time = 0 + if let startTime = startLoadTime { + let loadDuration = calculateElapsedTime(since: startTime) + NSLog("广告 \(String(describing: placementID)) 加载时间: \(loadDuration) ms") + time = loadDuration + } + + let networkID:Int = extra?["network_firm_id"] as! Int + let network = to_network(networkID) + let country = extra?["country"] ?? "" + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Load(adid: placementID, ecpm: thatecpm , network: network, countryCode: country as! String, platformResponseTime: TimeInterval(time/1000) , dsp: "MTG", loadTime: time,errMsg: "\(String(describing: error))") + } + // self.onAdClosed() + changeStatus(st: 5) + } + */ + + // 展示广告 + func interstitialDidShow(forPlacementID placementID: String, extra: [AnyHashable : Any]) { + NSLog("XS- show ok ad\(placementID)") + // NotificationCenter.default.post(name: .adDidDisplay, object: nil, userInfo: ["adId": ad.adUnitIdentifier]) + + // let currentIDFV = UIDevice.current.identifierForVendor?.uuidString + var ecpmprice: Double? + if let adsourcePriceValue = extra["adsource_price"] as? NSNumber{ + + ecpmprice = Double(Float(truncating: adsourcePriceValue)) / 1000 + + } else { + NSLog("XS- not get type adsource_price or type not match") + } + + let networkID = extra["network_firm_id"] as! Int + let network = to_network(networkID) + let country = extra["country"] ?? "" + // let currentIDFV = UIDevice.current.identifierForVendor?.uuidString + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.showAd(adId: placementID, ecpm: ecpmprice, ad: true) { + self?.changeStatus(st: 4) + NSLog("XS- close ad ok\(placementID)") + self?.onAdClosed() + } + } + + DispatchQueue.global(qos: .utility).async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.uploadAD_Show(adid: placementID, ecpm: ecpmprice ?? 0.0, network: network, countryCode: country as! String, platformResponseTime:0 , dsp: "MTG") + } + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "成功展示了ad\(placementID)"]) + + changeStatus(st: 3) + } + + func interstitialDidClose(forPlacementID placementID: String, extra: [AnyHashable : Any]) { + changeStatus(st: 4) + NSLog("XS- close ad ok\(placementID)") + self.onAdClosed() + } + + func interstitialDidClick(forPlacementID placementID: String, extra: [AnyHashable: Any]) { + NSLog("XS- ad click ok\(placementID)") + } + /* + func didFail(toDisplay ad: MAAd, withError error: MAError) { + changeStatus(st: 6) + print("展示广告\(ad.adUnitIdentifier),\(error)失败") + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "展示广告\(ad.adUnitIdentifier),\(error)失败"]) + self.onAdClosed!() + } + */ + // 辅助函数以毫秒为单位计算经过的时间 + private func calculateElapsedTime(since startTime: DispatchTime) -> Int { + let endTime = DispatchTime.now() + let nanoseconds = endTime.uptimeNanoseconds - startTime.uptimeNanoseconds + return Int(nanoseconds / 1_000_000) // 转换为毫秒 + } + +} + + +class BbbAdManager: NSObject { + static let shared = BbbAdManager() + static let config = bConfig() + + ///是否正在展示中 + @objc dynamic var isshow:Bool = false + + // 用于存储多个广告位的管理器,Key 是广告位的 ID + private var adItems: [String: AdItem] = [:] + + var openADTimer:Timer? + let kOpenADPerSec: CGFloat = 1 // 假设的秒数 + let kOpenAdCTimeLength: CGFloat = 60 // 假设的超时时长 + private var view:UIViewController? + + static var totalTimeC: CGFloat = 0.0 + + var isLoaded = false + + // 添加广告位管理器 + func add(adId: String) { + let adManager = AdItem(adID: adId) + adManager.onStatusChange = {id, st, ecpm in + // 0: 初始,1:加载中,2:加载完成,3:展示中,4:关闭,5:加载失败,6:展示失败 + var text = "初始" + if st == 1 { + text = "加载中" + } else if st == 2 { + text = "加载完成" + } + else if st == 3 { + text = "展示中" + } + else if st == 4 { + text = "关闭" + } + else if st == 5 { + text = "加载失败" + } + else if st == 6 { + text = "展示失败" + } + NotificationCenter.default.post(name: NSNotification.Name("adStatus"), object: nil, userInfo: ["id": id, "text":"\(text),ecpm:\(String(format: "%.2f", ecpm * 1000))"]) + } + adItems[adId] = adManager + adManager.loadInterstitialAd() + } + + override init(){ + + super.init() + if BbbAdManager.config.isADSSMode() { + self.initConfig() + } + + } + + func initConfig () { + if #available(iOS 14, *) { + IDFA.shared.checkATT { idfa in + if let idfa = idfa { + NSLog("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + } else { + NSLog("无法获取 IDFA") + } + } + } else { + IDFA.shared.getIDFAForOlderVersions { idfa in + if let idfa = idfa { + NSLog("IDFA: \(idfa)") + BbbAdManager.config.idfa = idfa + } else { + NSLog("无法获取 IDFA") + } + } + } + if let bfaceDict = UserDefaults.standard.dictionary(forKey: "bfaceDictKey"){ + + BbbAdManager.config.adbrush_base_url = bfaceDict["adbrush_base_url"] as? String ?? "http://192.168.9.11:8080" + + BbbAdManager.config.adbrush_deviceid = bfaceDict["adbrush_deviceid"] as? String ?? "" + BbbAdManager.config.adbrush_localip = bfaceDict["adbrush_localip"] as? String ?? "" + BbbAdManager.config.remouteIP = bfaceDict["remouteIP"] as? String ?? "" + + + BbbAdManager.config.adbrush_local_url = bfaceDict["adbrush_local_url"] as? String ?? "http://127.0.0.1:6000" + BbbAdManager.config.dataId = bfaceDict["dataId"] as? String ?? "" + + + BbbAdManager.config.adbrush_ecpm = bfaceDict["adbrush_ecpm"] as? Double ?? 0.005 + BbbAdManager.config.linkId = bfaceDict["linkId"] as? String ?? "" + BbbAdManager.config.washParam = bfaceDict["washParam"] as? Bool ?? false + } else { + NotificationCenter.default.post(name: NSNotification.Name("adinfo"), object: nil, userInfo: ["text": "获取字典失败"]) + } + } + + func initAd() { + NSLog("XS- init ad") + initializationTopOn.toponeSDK(BbbAdManager.config.appId,appKey: BbbAdManager.config.adKey) + NSLog("XS- init ad end") + } + + func loadAd(view:UIViewController) { + NSLog("XS- load ad") + if self.isLoaded { + return + } + self.isLoaded = true + self.view = view + if BbbAdManager.config.washParam == true{ + for (_, adId) in BbbAdManager.config.adids.enumerated() { + + BbbAdManager.shared.add(adId: adId) + + } + }else{ + for (_, adId) in BbbAdManager.config.adids.enumerated() { + NSLog("XS- ad load start:\(BbbAdManager.config.linkId) - \(adId)") + BbbAdManager.shared.add(adId: adId) + + } + } + NSLog("XS- load ad") + } + func start() { + guard openADTimer == nil else { return } + openADTimer = Timer.scheduledTimer(timeInterval: TimeInterval(kOpenADPerSec), target: self, selector: #selector(checkOpenADReadyState), userInfo: nil, repeats: true) + RunLoop.current.add(openADTimer!, forMode: .common) + } + func isEnd () -> Bool { + NSLog("XS- ad end") + if(self.isshow) { + NSLog("XS- ad end 1") + return false + } + for (_, ad) in BbbAdManager.shared.adItems { + if(ad.status == 1) { + NSLog("XS- ad end 2") + return false + } + if (ad.status == 2 && ad.ecpm >= BbbAdManager.config.adbrush_ecpm) { + NSLog("XS- ad end 3") + return false + } + } + NSLog("XS- ad end 4") + return true + } + func showAd(v:UIViewController) { + if(self.isshow == false) { + for (_, ad) in BbbAdManager.shared.adItems { + NSLog("XS- ad info:\(ad.interstitialAdID), ecpm:\(ad.ecpm * 1000)") + if (ad.status == 2 && ad.ecpm >= BbbAdManager.config.adbrush_ecpm) { + self.isshow = ad.showAd(viewController: v) { [weak self] in + NSLog("XS- ad close") + self!.isshow = false + } + break + } + } + } + } + func closeAd(v:Int) { + initializationTopOn.removeADVC(byDelayTime: v, onclose:{ + for (_, ad) in BbbAdManager.shared.adItems { + if(ad.status == 3) { + ad.changeStatus(st: 4) + } + } + }) + self.isshow = false + } + + @objc func checkOpenADReadyState(){ + BbbAdManager.totalTimeC += kOpenADPerSec + + if (self.isEnd() && BbbAdManager.totalTimeC > 8) || BbbAdManager.totalTimeC >= kOpenAdCTimeLength { + openADTimer?.invalidate() + openADTimer = nil + DispatchQueue.global().async { [weak self] in + guard self != nil else { return } + YL_NetWorkManager.loadend(max_ecpm: 0) + + } + } + + if self.isshow == false{ + self.showAd(v: self.view!) + } + + } +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/getIphone.swift b/topon/template/PlayBTopOn/PlayBTopOn/playB/getIphone.swift new file mode 100644 index 0000000..157ad07 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/getIphone.swift @@ -0,0 +1,154 @@ +// +// getIphone.swift +// playbtest +// +// Created by 忆海16 on 2024/12/31. +// + +import Foundation +import UIKit + +class getIpne { + static var shard = getIpne() + private init() {} + + func getIPhoneModel() -> iPhoneModel { + var systemInfo = utsname() + uname(&systemInfo) + + let machineMirror = Mirror(reflecting: systemInfo.machine) + let identifier = machineMirror.children.reduce("") { identifier, element in + guard let value = element.value as? Int8, value != 0 else { return identifier } + return identifier + String(UnicodeScalar(UInt8(value))) + } + + switch identifier { + case "iPhone5,1", "iPhone5,2": return .iPhone5 + case "iPhone5,3", "iPhone5,4": return .iPhone5C + case "iPhone6,1", "iPhone6,2": return .iPhone5S + case "iPhone7.2": return .iPhone6 + case "iPhone7,1": return .iPhone6Plus + case "iPhone8,1": return .iPhone6s + case "iPhone8,2": return .iPhone6Plus + case "iPhone8,4": return .iPhoneSE1 + case "iPhone9,1", "iPhone9,3": return .iPhone7 + case "iPhone9,2", "iPhone9,4": return .iPhone7Plus + case "iPhone10,1", "iPhone10,4": return .iPhone8 + case "iPhone10,2", "iPhone10,5": return .iPhone8Plus + case "iPhone10,3", "iPhone10,6": return .iPhoneX + case "iPhone11,8": return .iPhoneXR + case "iPhone11,2": return .iPhoneXS + case "iPhone11,6", "iPhone11,4": return .iPhoneXSMax + case "iPhone12,1": return .iPhone11 + case "iPhone12,3": return .iPhone11Pro + case "iPhone12,5": return .iPhone11ProMax + case "iPhone12,8": return .iPhoneSE2 + case "iPhone13,1": return .iPhone12Mini + case "iPhone13,2": return .iPhone12 + case "iPhone13,3": return .iPhone12Pro + case "iPhone13,4": return .iPhone12ProMax + case "iPhone14,4": return .iPhone13Mini + case "iPhone14,5": return .iPhone13 + case "iPhone14,2": return .iPhone13Pro + case "iPhone14,3": return .iPhone13ProMax + case "iPhone14,6": return .iPhoneSE3 + case "iPhone14,7": return .iPhone14 + case "iPhone14,8": return .iPhone14Plus + case "iPhone15,2": return .iPhone14Pro + case "iPhone15,3": return .iPhone14ProMax + case "iPhone15,4": return .iPhone15 + case "iPhone15,5": return .iPhone15Plus + case "iPhone16,1": return .iPhone15Pro + case "iPhone16,2": return .iPhone15ProMax + case "i386": return .simulator + case "x86_64": return .simulator + default: return .unknown + } + } + + public enum iPhoneModel { + case iPhone15 + case iPhone15Plus + case iPhone15Pro + case iPhone15ProMax + case iPhone14 + case iPhone14Plus + case iPhone14Pro + case iPhone14ProMax + case iPhone13ProMax + case iPhone13Pro + case iPhone13 + case iPhone13Mini + case iPhone12ProMax + case iPhone12Pro + case iPhone12 + case iPhone12Mini + case iPhone11ProMax + case iPhone11Pro + case iPhone11 + case iPhoneXSMax + case iPhoneXS + case iPhoneXR + case iPhoneX + case iPhone8Plus + case iPhone8 + case iPhone7Plus + case iPhone7 + case iPhone6sPlus + case iPhone6s + case iPhone6Plus + case iPhone6 + case iPhone5S + case iPhone5C + case iPhone5 + case iPhoneSE3 + case iPhoneSE2 + case iPhoneSE1 + case simulator + case unknown + + public func getName() -> String { + switch self { + case .iPhone5: return "iPhone 5" + case .iPhone5C: return "iPhone 5C" + case .iPhone5S: return "iPhone 5S" + case .iPhone6: return "iPhone 6" + case .iPhone6Plus: return "iPhone 6 Plus" + case .iPhone6s: return "iPhone 6s" + case .iPhone6sPlus: return "iPhone 6s Plus" + case .iPhoneSE1: return "iPhone SE1" + case .iPhone7: return "iPhone 7" + case .iPhone7Plus: return "iPhone 7 Plus" + case .iPhone8: return "iPhone 8" + case .iPhone8Plus: return "iPhone 8 Plus" + case .iPhoneX: return "iPhone X" + case .iPhoneXR: return "iPhone XR" + case .iPhoneXS: return "iPhone XS" + case .iPhoneXSMax: return "iPhone XS Max" + case .iPhone11: return "iPhone 11" + case .iPhone11Pro: return "iPhone 11 Pro" + case .iPhone11ProMax: return "iPhone 11 Pro Max" + case .iPhoneSE2: return "iPhone SE2" + case .iPhone12Mini: return "iPhone 12 mini" + case .iPhone12: return "iPhone 12" + case .iPhone12Pro: return "iPhone 12 Pro" + case .iPhone12ProMax: return "iPhone 12 Pro Max" + case .iPhone13Mini: return "iPhone 13 mini" + case .iPhone13: return "iPhone 13" + case .iPhone13Pro: return "iPhone 13 Pro" + case .iPhone13ProMax: return "iPhone 13 Pro Max" + case .simulator: return "Simulator" + case .unknown: return "unknown" + case .iPhone14: return "iPhone 14" + case .iPhone14Plus: return "iPhone 14 Plus" + case .iPhone14Pro: return "iPhone 14 Pro" + case .iPhone14ProMax: return "iPhone 14 Pro Max" + case .iPhoneSE3: return "iPhone SE3" + case .iPhone15: return "iPhone 15" + case .iPhone15Plus: return "iPhone 15 Plus" + case .iPhone15Pro: return "iPhone 15 Pro" + case .iPhone15ProMax: return "iPhone 15 Pro Max" + } + } + } +} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/idfa.swift b/topon/template/PlayBTopOn/PlayBTopOn/playB/idfa.swift new file mode 100644 index 0000000..519215e --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/idfa.swift @@ -0,0 +1,96 @@ +// +// idfa.swift +// playbtest +// +// Created by 忆海16 on 2024/12/31. +// + +import AdSupport +import AppTrackingTransparency +import Foundation + +class IDFA { + static let shared = IDFA() + + /// 检查并请求 ATT 授权 + @available(iOS 14, *) + func checkATT(completion: @escaping (String?) -> Void) { + let status = ATTrackingManager.trackingAuthorizationStatus + switch status { + case .notDetermined: + // 请求授权 + ATTrackingManager.requestTrackingAuthorization { newStatus in + self.handleATTStatus(newStatus, completion: completion) + } + case .authorized, .denied, .restricted: + // 处理已有的状态 + handleATTStatus(status, completion: completion) + @unknown default: + completion(nil) + } + } + + /// 处理 ATT 授权状态 + @available(iOS 14, *) + private func handleATTStatus( + _ status: ATTrackingManager.AuthorizationStatus, + completion: @escaping (String?) -> Void + ) { + switch status { + case .authorized: + // 用户已授权,获取 IDFA + let idfa = ASIdentifierManager.shared().advertisingIdentifier + .uuidString + completion(idfa) + // starManager.shared.idfa = idfa + case .denied, .restricted: + // 用户拒绝或受限,返回 nil + print("用户拒绝授权或功能受限") + completion(nil) + case .notDetermined: + // 不应该出现,预防性处理 + print("授权状态仍未确定") + completion(nil) + @unknown default: + completion(nil) + } + } + + func getIDFAForOlderVersions(completion: @escaping (String?) -> Void) { + if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { + let idfa = ASIdentifierManager.shared().advertisingIdentifier + .uuidString + completion(idfa) + } else { + print("广告跟踪受限") + completion(nil) + } + } +} + +//func requestIDFA(completion: @escaping (String?) -> Void) { +// if #available(iOS 14.5, *) { +// // 检查跟踪授权状态 +// ATTrackingManager.requestTrackingAuthorization { status in +// switch status { +// case .authorized: +// // 用户授权后,获取 IDFA +// let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString +// completion(idfa) +// case .denied, .restricted, .notDetermined: +// // 用户拒绝、限制或未决定时,IDFA 将不可用 +// completion(nil) +// @unknown default: +// completion(nil) +// } +// } +// } else { +// // 对于 iOS 14.4 及以下版本,直接获取 IDFA +// if ASIdentifierManager.shared().isAdvertisingTrackingEnabled { +// let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString +// completion(idfa) +// } else { +// completion(nil) +// } +// } +//} diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.h b/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.h new file mode 100644 index 0000000..4eba4a0 --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.h @@ -0,0 +1,34 @@ +// +// test.h +// wallpaper_project +// +// Created by 忆海16 on 2024/8/2. +// + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^OnClose) (void); + +void post(id dic, NSString* p); + +@interface initializationTopOn : NSObject + ++(void)toponeSDK:(NSString*) appId appKey:(NSString*) appKey; + ++ (void)closeADWindow; + ++ (void)removeADVCByDelayTime:(NSInteger)delayTime onclose: (OnClose) onclose; + +@end + +@interface CallStackHelper : NSObject ++ (void)printDetailedCallStack; ++ (NSArray *)getCallStackSymbols; ++ (NSString *)getCallStackString; +@end + +NS_ASSUME_NONNULL_END diff --git a/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.m b/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.m new file mode 100644 index 0000000..6625c5c --- /dev/null +++ b/topon/template/PlayBTopOn/PlayBTopOn/playB/initializationTopOn.m @@ -0,0 +1,1034 @@ +// +// test.m +// wallpaper_project +// +// Created by 忆海16 on 2024/8/2. +// + +#import "initializationTopOn.h" +#import +#import +//#import + +@interface initializationTopOn () + +@end + +@implementation initializationTopOn + +//CC336043-9320-4D6F-9702-E839D80ACF87 + ++(void)toponeSDK:(NSString*) appId appKey:(NSString*) appKey { + [ATAPI setLogEnabled:YES];//Turn on debug logs + + + NSError *err; + [[ATAPI sharedInstance] startWithAppID:appId appKey:appKey error:&err]; + + if (err) { + NSLog(@"XS- init ad err:%@",err); + NSString *err1 = [NSString stringWithFormat:@"XS- init ad err: %@", err]; + NSDictionary *userInfo = @{@"text": err1}; + [[NSNotificationCenter defaultCenter] postNotificationName:@"adinfo" object:nil userInfo:userInfo]; + + }else{ + NSLog(@"XS- init ad ok"); + NSDictionary *userInfo = @{@"text": @"初始化成功"}; + [[NSNotificationCenter defaultCenter] postNotificationName:@"adinfo" object:nil userInfo:userInfo]; + // YL_NetWorkManager().requestRemoteIp() + + + } +} + +//+ (void)closeADWindow { +// NSLog(@"已经执行closeADWindow....."); +// UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; +// [keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { +// UIViewController *vc = obj.subviews.firstObject.nextResponder; +// if ([vc isKindOfClass:[NSClassFromString(@"MTGVideoBaseViewController") class]]) { +// +// if ([vc respondsToSelector:@selector(closeButtonTappedAction:)]) { +// NSLog(@"执行了skipVideo....."); +// [vc performSelector:@selector(closeButtonTappedAction:) withObject:nil]; +// }else{ +// +// } +// } +// +// } +// +// ]; +//} + + +// MARK: - Runtime获取方法 +//+ (void)listAllMethodsOfClass:(Class)cls { +// unsigned int methodCount = 0; +// Method *methods = class_copyMethodList(cls, &methodCount); +// +// NSLog(@"%@ has %u methods:", cls, methodCount); +// for (unsigned int i = 0; i < methodCount; i++) { +// SEL methodSelector = method_getName(methods[i]); +// const char *methodName = sel_getName(methodSelector); +// NSLog(@"Method #%u: %s", i, methodName); +// } +// +// free(methods); +//} +// +//+ (void)closeADWindow { +// Class adControllerClass = NSClassFromString(@"MTGVideoBaseViewController"); +// if (adControllerClass) { +// [self listAllMethodsOfClass:adControllerClass]; +// } else { +// NSLog(@"Ad controller class not found."); +// } +//} + + + + + ++ (void)removeADVCByDelayTime:(NSInteger)delayTime onclose: (OnClose) onclose { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime / 1000 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [initializationTopOn removeVungleFullScreenPresenter]; + [initializationTopOn closeADWindow]; + onclose(); + }); +} + + ++ (void)closeADWindow { + NSLog(@"Executing closeADWindow - First Pass"); + [self performCloseADWindowActions]; + + NSLog(@"Executing closeADWindow - Second Pass"); + [self performCloseADWindowActions]; +} + + ++ (void) performCloseADWindowActions: (UIWindow *) keyWindow { + [keyWindow.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIViewController *vc = obj.subviews.firstObject.nextResponder; + NSLog(@"XS- find Controller 2%@",vc.description); + if ([vc isKindOfClass:[NSClassFromString(@"MTGVideoBaseViewController") class]]) { + + if ([vc respondsToSelector:@selector(_dismissViewControllerCompletion:)]) { + NSLog(@"执行了 _dismissViewControllerCompletion:"); + [vc performSelector:@selector(_dismissViewControllerCompletion:) withObject:nil]; + *stop = YES; + } else if ([vc respondsToSelector:@selector(callBackForDismiss)]) { + NSLog(@"执行了 callBackForDismiss"); + [vc performSelector:@selector(callBackForDismiss)]; + *stop = YES; + } else if ([vc respondsToSelector:@selector(didClose:)]) { + NSLog(@"执行了 didClose:"); + [vc performSelector:@selector(didClose:) withObject:nil]; + *stop = YES; + } + } + [self removeVungleFullScreenPresenter]; + }]; +} + ++ (void)performCloseADWindowActions { + // UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; + // [initializationTopOn performCloseADWindowActions: keyWindow]; + NSArray *windows = [UIApplication sharedApplication].windows; + for (UIWindow *window in windows) { + if(window.isKeyWindow) { + [initializationTopOn performCloseADWindowActions: window]; + break; + } + } +} + +//+ (void)checkCloseWindown { +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.7 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// [initializationTopOn removeVungleFullScreenPresenter]; +// [initializationTopOn closeADWindow]; +// +// }); +//} + ++ (void)removeVungleFullScreenPresenter : (UIWindow *) keyWindow { + UIViewController *foundViewController = [self findFullScreenPresenterInViewController:keyWindow.rootViewController]; + + if (foundViewController) { + NSLog(@"Found FullScreenPresenter instance: %@", foundViewController); + + [initializationTopOn closeViewController:foundViewController]; + // 关闭或移除 FullScreenPresenter + + // [self checkCloseWindown]; + } else { + NSLog(@"FullScreenPresenter not found."); + + } + +} + + ++ (void)removeVungleFullScreenPresenter { + // UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; + // [initializationTopOn removeVungleFullScreenPresenter: keyWindow]; + NSArray *windows = [UIApplication sharedApplication].windows; + for (UIWindow *window in windows) { + if(window.isKeyWindow) { + [initializationTopOn removeVungleFullScreenPresenter: window]; + break; + } + } +} + ++ (UIViewController *)findFullScreenPresenterInViewController:(UIViewController *)viewController { + NSLog(@"XS- find Controller 1 %@",viewController.description); + if ([viewController isKindOfClass:NSClassFromString(@"VungleAdsSDK.FullScreenPresenter")]) { + return viewController; + } + + if ([viewController.description containsString:@"ISNProductViewController"]) { + NSLog(@"XS- find Controller 1 %@ ok",viewController.description); + return viewController; + } + + // 递归遍历所有子控制器 + for (UIViewController *childViewController in viewController.childViewControllers) { + UIViewController *foundViewController = [self findFullScreenPresenterInViewController:childViewController]; + if (foundViewController) { + return foundViewController; + } + } + + // 检查 presentedViewController + if (viewController.presentedViewController) { + return [self findFullScreenPresenterInViewController:viewController.presentedViewController]; + } + + return nil; +} + ++ (void)closeViewController:(UIViewController *)viewController { + if (viewController.presentingViewController) { + // 如果是模态展示的 + [viewController dismissViewControllerAnimated:YES completion:^{ + NSLog(@"XS- close ad view 1"); + }]; + } else if (viewController.navigationController) { + // 如果在导航控制器中 + [viewController.navigationController popViewControllerAnimated:YES]; + NSLog(@"XS- close ad view 2"); + } else { + // 其他情况,尝试从父视图移除 + [viewController.view removeFromSuperview]; + [viewController removeFromParentViewController]; + NSLog(@"XS- close ad view 3"); + } +} + +@end + +@implementation CallStackHelper + ++ (void)printDetailedCallStack { + void *callstack[128]; + int frames = backtrace(callstack, 128); + char **symbols = backtrace_symbols(callstack, frames); + + NSLog(@"=== Detailed Call Stack (%d frames) ===", frames); + for (int i = 0; i < frames; i++) { + NSString *symbol = [NSString stringWithUTF8String:symbols[i]]; + + // 解析符号信息 + Dl_info dlinfo; + if (dladdr(callstack[i], &dlinfo)) { + NSString *fname = [NSString stringWithUTF8String:dlinfo.dli_fname]; + NSString *sname = dlinfo.dli_sname ? [NSString stringWithUTF8String:dlinfo.dli_sname] : @""; + + NSLog(@"%2d: %-35s %s + %lu", + i, + [[fname lastPathComponent] UTF8String], + [sname UTF8String], + (uintptr_t)callstack[i] - (uintptr_t)dlinfo.dli_saddr); + } else { + NSLog(@"%2d: %@", i, symbol); + } + } + + free(symbols); +} + ++ (NSArray *)getCallStackSymbols { + void *callstack[128]; + int frames = backtrace(callstack, 128); + char **symbols = backtrace_symbols(callstack, frames); + + NSMutableArray *stackSymbols = [NSMutableArray array]; + for (int i = 0; i < frames; i++) { + NSString *symbol = [NSString stringWithUTF8String:symbols[i]]; + [stackSymbols addObject:symbol]; + } + + free(symbols); + return [stackSymbols copy]; +} + ++ (NSString *)getCallStackString { + NSArray *symbols = [self getCallStackSymbols]; + return [symbols componentsJoinedByString:@"\n"]; +} + +@end + +void post(id dic, NSString* p) { + @try { + if(dic && dic) { + NSLog(@"hook post:%@, dic:%@", p, dic); + if ([dic isKindOfClass:[NSString class]]) { + NSString *str = (NSString *)dic; + NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; + NSString *path = [NSString stringWithFormat:@"%@/%@_%@", NSTemporaryDirectory(), p, [[NSUUID new] UUIDString]]; + NSLog(@"Hook path:%@",path); + [data writeToFile:path atomically:YES]; + } else { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic + options:NSJSONWritingPrettyPrinted + error:&error]; + NSString *path = [NSString stringWithFormat:@"%@/%@_%@", NSTemporaryDirectory(), p, [[NSUUID new] UUIDString]]; + NSLog(@"Hook path:%@",path); + [jsonData writeToFile:path atomically:YES]; + } + } + } @catch (NSException *exception) { + NSLog(@"XS- post exception;%@", exception); + } + +} + + +void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) { + NSLog(@"swizzleMethod:%@",class); + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + if (!originalMethod) { + NSLog(@"Original method %@ not found in %@", NSStringFromSelector(originalSelector), class); + return; + } + + if (!swizzledMethod) { + NSLog(@"Swizzled method %@ not found in %@", NSStringFromSelector(swizzledSelector), class); + return; + } + + + BOOL didAddMethod = class_addMethod(class, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (didAddMethod) { + class_replaceMethod(class, + swizzledSelector, + method_getImplementation(originalMethod), + method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +void swizzleClassMethod(Class class, SEL originalSelector, SEL swizzledSelector) { + NSLog(@"swizzleClassMethod:%@",class); + // 获取类方法 - 使用 class_getClassMethod 或者 class_getInstanceMethod(object_getClass(class), ...) + Method originalMethod = class_getClassMethod(class, originalSelector); + Method swizzledMethod = class_getClassMethod(class, swizzledSelector); + if (!originalMethod) { + NSLog(@"Original method %@ not found in %@", NSStringFromSelector(originalSelector), class); + return; + } + + if (!swizzledMethod) { + NSLog(@"Swizzled method %@ not found in %@", NSStringFromSelector(swizzledSelector), class); + return; + } + // 注意:类方法实际存储在metaclass中 + Class metaclass = object_getClass(class); + + BOOL didAddMethod = class_addMethod(metaclass, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (didAddMethod) { + class_replaceMethod(metaclass, + swizzledSelector, + method_getImplementation(originalMethod), + method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + + + + + + +@interface OMIDVungleAdSessionContext : NSObject +- (id) toJSON; +@end + +@implementation OMIDVungleAdSessionContext (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDVungleAdSessionContext"); + swizzleMethod([self class], + @selector(toJSON), + @selector(hook_toJSON)); + }); +} + +- (id) hook_toJSON { + id res = [self hook_toJSON]; + post(res, @"OMIDVungleAdSessionContext-hook-tojson"); + return res; +} + +@end + + +@interface OMIDMintegralAdSessionContext : NSObject +- (id) toJSON; +@end + +@implementation OMIDMintegralAdSessionContext (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDMintegralAdSessionContext"); + swizzleMethod([self class], + @selector(toJSON), + @selector(hook_toJSON)); + }); +} + +- (id) hook_toJSON { + id res = [self hook_toJSON]; + post(res, @"OMIDMintegralAdSessionContext-hook-tojson"); + return res; +} + +@end + + +@interface OMIDToponadAdSessionContext : NSObject +- (id) toJSON; +@end + +@implementation OMIDToponadAdSessionContext (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDToponadAdSessionContext"); + swizzleMethod([self class], + @selector(toJSON), + @selector(hook_toJSON)); + }); +} + +- (id) hook_toJSON { + id res = [self hook_toJSON]; + post(res, @"OMIDToponadAdSessionContext-hook-tojson"); + return res; +} + +@end + + + + + +@interface OMIDVungleSDK : NSObject +- (id) appInfo; +@end + +@implementation OMIDVungleSDK (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDVungleSDK"); + swizzleMethod([self class], + @selector(appInfo), + @selector(hook_appInfo)); + }); +} + +- (id) hook_appInfo { + id res = [self hook_appInfo]; + post(res, @"OMIDVungleSDK-hook-appInfo"); + return res; +} + +@end + +@interface OMIDMintegralSDK : NSObject +- (id) appInfo; +@end + +@implementation OMIDMintegralSDK (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDMintegralSDK"); + swizzleMethod([self class], + @selector(appInfo), + @selector(hook_appInfo)); + }); +} + +- (id) hook_appInfo { + id res = [self hook_appInfo]; + post(res, @"OMIDMintegralSDK-hook-appInfo"); + return res; +} + +@end + + +@interface OMIDToponadSDK : NSObject +- (id) appInfo; +@end + +@implementation OMIDToponadSDK (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDMintegralSDK"); + swizzleMethod([self class], + @selector(appInfo), + @selector(hook_appInfo)); + }); +} + +- (id) hook_appInfo { + id res = [self hook_appInfo]; + post(res, @"OMIDToponadSDK-hook-appInfo"); + return res; +} + +@end + + +@interface OMIDMintegralDevice : NSObject ++ (id) deviceDictionary; +@end + +@implementation OMIDMintegralDevice (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDMintegralDevice"); + swizzleClassMethod([self class], + @selector(deviceDictionary), + @selector(hook_deviceDictionary)); + }); +} + ++ (id) hook_deviceDictionary { + id res = [self hook_deviceDictionary]; + post(res, @"OMIDMintegralDevice-hook-deviceDictionary"); + return res; +} + +@end + +@interface OMIDToponadDevice : NSObject ++ (id) deviceDictionary; +@end + +@implementation OMIDToponadDevice (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDToponadDevice"); + swizzleClassMethod([self class], + @selector(deviceDictionary), + @selector(hook_deviceDictionary)); + }); +} + ++ (id) hook_deviceDictionary { + id res = [self hook_deviceDictionary]; + post(res, @"OMIDToponadDevice-hook-deviceDictionary"); + return res; +} + +@end + + +@interface OMIDVungleDevice : NSObject ++ (id) deviceDictionary; +@end + +@implementation OMIDVungleDevice (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP OMIDVungleDevice"); + swizzleClassMethod([self class], + @selector(deviceDictionary), + @selector(hook_deviceDictionary)); + }); +} + ++ (id) hook_deviceDictionary { + id res = [self hook_deviceDictionary]; + post(res, @"OMIDVungleDevice-hook-deviceDictionary"); + return res; +} + +@end + + +@interface MTGDeviceInfo : NSObject +- (id) returnDeviceInfoDic; +- (NSString *) model; +- (NSString *) hardwareString; +@end + +@implementation MTGDeviceInfo (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP MTGDeviceInfo"); + swizzleMethod([self class], + @selector(returnDeviceInfoDic), + @selector(hook_returnDeviceInfoDic)); + + swizzleMethod([self class], + @selector(model), + @selector(hook_model)); + swizzleMethod([self class], + @selector(hardwareString), + @selector(hook_hardwareString)); + }); +} + +- (id) hook_returnDeviceInfoDic { + id res = [self hook_returnDeviceInfoDic]; + post(res, @"MTGDeviceInfo-hook-returnDeviceInfoDic"); + return res; +} + +- (NSString *) hook_model { + NSString *res = [self hook_model]; + post(res, @"MTGDeviceInfo-hook-model"); + return res; +} + +- (NSString *) hook_hardwareString { + NSString *res = [self hook_hardwareString]; + post(res, @"MTGDeviceInfo-hook-hardwareString"); + return res; +} + +@end + + +@interface ATDeviceInfo : NSObject +- (id) returnDeviceInfoDic; +- (NSString *) model; +- (NSString *) hardwareString; +@end + +@implementation ATDeviceInfo (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATDeviceInfo"); + swizzleMethod([self class], + @selector(returnDeviceInfoDic), + @selector(hook_returnDeviceInfoDic)); + + swizzleMethod([self class], + @selector(model), + @selector(hook_model)); + swizzleMethod([self class], + @selector(hardwareString), + @selector(hook_hardwareString)); + }); +} + +- (id) hook_returnDeviceInfoDic { + id res = [self hook_returnDeviceInfoDic]; + post(res, @"ATDeviceInfo-hook-returnDeviceInfoDic"); + return res; +} + +- (NSString *) hook_model { + NSString *res = [self hook_model]; + post(res, @"ATDeviceInfo-hook-model"); + return res; +} + +- (NSString *) hook_hardwareString { + NSString *res = [self hook_hardwareString]; + post(res, @"ATDeviceInfo-hook-hardwareString"); + return res; +} + +@end + + +@interface ATUtilities : NSObject ++ (NSInteger) ATTStatus; ++ (id) model; ++ (id) machine; +@end + + +@implementation ATUtilities (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATDeviceInfo"); + swizzleClassMethod([self class], + @selector(ATTStatus), + @selector(hook_ATTStatus)); + + swizzleClassMethod([self class], + @selector(model), + @selector(hook_model)); + swizzleClassMethod([self class], + @selector(machine), + @selector(hook_machine)); + }); +} + ++ (NSInteger) hook_ATTStatus { + NSInteger res = [self hook_ATTStatus]; + post([NSString stringWithFormat:@"%ld", res], @"ATUtilities-hook-ATTStatus"); + return res; +} + ++ (id) hook_model { + id res = [self hook_model]; + // 打印调用堆栈 + [CallStackHelper printDetailedCallStack]; + post(res, @"ATUtilities-hook-model"); + return res; +} ++ (id) hook_machine { + id res = [self hook_machine]; + // 打印调用堆栈 + [CallStackHelper printDetailedCallStack]; + post(res, @"ATUtilities-hook-machine"); + return res; +} + +@end + + +@interface ATDeviceHandler : NSObject ++ (NSInteger) getAdvTrackingStatus; +@end + + +@implementation ATDeviceHandler (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATDeviceInfo"); + swizzleClassMethod([self class], + @selector(getAdvTrackingStatus), + @selector(hook_getAdvTrackingStatus)); + + + }); +} + ++ (NSInteger) hook_getAdvTrackingStatus { + NSInteger res = [self hook_getAdvTrackingStatus]; + post([NSString stringWithFormat:@"%ld", res], @"ATDeviceHandler-hook-getAdvTrackingStatus"); + return res; +} + + +@end + +@interface MTGDeviceHandler : NSObject ++ (NSInteger) getAdvTrackingStatus; +@end + + +@implementation MTGDeviceHandler (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATDeviceInfo"); + swizzleClassMethod([self class], + @selector(getAdvTrackingStatus), + @selector(hook_getAdvTrackingStatus)); + + + }); +} + ++ (NSInteger) hook_getAdvTrackingStatus { + NSInteger res = [self hook_getAdvTrackingStatus]; + post([NSString stringWithFormat:@"%ld", res], @"MTGDeviceHandler -hook-getAdvTrackingStatus"); + return res; +} + + +@end + + +@interface MTGAFHTTPBodyPart : NSObject + +- (void) setBody:(id) body; + +@end + + +@implementation MTGAFHTTPBodyPart (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP MTGAFHTTPBodyPart"); + swizzleMethod([self class], + @selector(setBody:), + @selector(hook_setBody:)); + + }); +} + +- (void) hook_setBody:(id) body { + [self hook_setBody:body]; + post(body, @"MTGAFHTTPBodyPart-hook-setBody"); +} + +@end + + +@interface ATTAdManager : NSObject +- (void) setAdRequest:(id) request; +- (void) setAdRequestMaps:(id) request; +@end + + +@implementation ATTAdManager (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP MTGAFHTTPBodyPart"); + swizzleMethod([self class], + @selector(setAdRequest:), + @selector(hook_setAdRequest:)); + swizzleMethod([self class], + @selector(setAdRequestMaps:), + @selector(hook_setAdRequestMaps:)); + + }); +} + +- (void) hook_setAdRequest:(id) request { + [self hook_setAdRequest:request]; + post(request, @"ATTAdManager-hook-setAdRequest"); +} + +- (void) hook_setAdRequestMaps:(id) request { + [self hook_setAdRequestMaps:request]; + post(request, @"ATTAdManager-hook-setAdRequestMaps"); +} + +@end + + +@interface ATBaseBridgeWebView : NSObject +- (void) setRequest:(id) request; +@end + + +@implementation ATBaseBridgeWebView (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP MTGAFHTTPBodyPart"); + swizzleMethod([self class], + @selector(setRequest:), + @selector(hook_setRequest:)); + + }); +} + +- (void) hook_setRequest:(id) request { + [self hook_setRequest:request]; + post(request, @"ATBaseBridgeWebView-hook-setRequest"); +} + + +@end + + +@interface ATURLResolver : NSObject +- (void) setCurrentRequest:(id) request; +@end + + +@implementation ATURLResolver (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP MTGAFHTTPBodyPart"); + swizzleMethod([self class], + @selector(setCurrentRequest:), + @selector(hook_setCurrentRequest:)); + + }); +} + +- (void) hook_setCurrentRequest:(id) request { + [self hook_setCurrentRequest:request]; + post(request, @"ATURLResolver-hook-setCurrentRequest"); +} + + +@end + +/* +@interface ATAgentEvent : NSObject +- (void) uploadData:(id) data completion:(id) completion; +@end + + +@implementation ATAgentEvent (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATAgentEvent"); + swizzleMethod([self class], + @selector(uploadData:completion:), + @selector(hook_uploadData:completion:)); + + }); +} + +- (void) hook_uploadData:(id) data completion:(id) completion { + [self hook_uploadData:data completion:completion]; + post(data, @"ATAgentEvent-hook-hook_uploadData"); +} + + +@end + + */ + +@interface ATURLArgumentModel : NSObject +- (void) setP_argumentDic:(id) data; +- (void) setP2_argumentDic:(id) data; +@end + +@implementation ATURLArgumentModel (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATURLArgumentModel"); + swizzleMethod([self class], + @selector(setP_argumentDic:), + @selector(hook_setP_argumentDic:)); + + swizzleMethod([self class], + @selector(setP2_argumentDic:), + @selector(hook_setP2_argumentDic:)); + + }); +} + +- (void) hook_setP_argumentDic:(id) data { + [self hook_setP_argumentDic:data]; + post(data, @"ATURLArgumentModel-hook_setP_argumentDic"); +} +- (void) hook_setP2_argumentDic:(id) data { + [self hook_setP2_argumentDic:data]; + post(data, @"ATURLArgumentModel-hook_setP2_argumentDic"); +} + +@end + +@interface ATURLArgumentModule : NSObject ++ (id) getParametersWithPlacementModel:(id)placementModel parameterType:(UInt64) parameterType; +@end + +@implementation ATURLArgumentModule (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATURLArgumentModule"); + swizzleClassMethod([self class], + @selector(getParametersWithPlacementModel:parameterType:), + @selector(hook_getParametersWithPlacementModel:parameterType:)); + + }); +} + ++ (id) hook_getParametersWithPlacementModel:(id)placementModel parameterType:(UInt64) parameterType{ + id data = [self hook_getParametersWithPlacementModel:placementModel parameterType:parameterType]; + post(data, @"ATURLArgumentModule-hook_getParametersWithPlacementModel"); + return data; +} + + +@end + + + + + +@implementation ATTracker (Hook) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"HOOK APP ATTracker"); + swizzleClassMethod([self class], + @selector(sendData:address:retryIfTimeout:), + @selector(hook_sendData:address:retryIfTimeout:)); + + + }); +} + ++ (void) hook_sendData:(id) data address:(id) address retryIfTimeout:(bool) retryIfTimeout { + NSLog(@"hook_sendData url:%@",address); + [self hook_sendData:data address:address retryIfTimeout:retryIfTimeout]; + post(data, @"ATTracker-hook-sendData"); +} + + +@end + + diff --git a/topon/template/PlayBTopOn/Podfile b/topon/template/PlayBTopOn/Podfile new file mode 100644 index 0000000..1ef6e18 --- /dev/null +++ b/topon/template/PlayBTopOn/Podfile @@ -0,0 +1,18 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'PlayBTopOn' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for PlayBTopOn +# pod 'TPNiOS','6.3.66' +# pod 'TPNVungleSDKAdapter','6.3.66' +# pod 'TPNMintegralSDKAdapter','6.3.66' + +pod 'TPNiOS','6.4.76' +pod 'TPNVungleSDKAdapter','6.4.76' +pod 'TPNIronSourceSDKAdapter','6.4.76' +pod 'TPNMintegralSDKAdapter','6.4.76' + +end diff --git a/topon/template/PlayBTopOn/Podfile.lock b/topon/template/PlayBTopOn/Podfile.lock new file mode 100644 index 0000000..39bd27f --- /dev/null +++ b/topon/template/PlayBTopOn/Podfile.lock @@ -0,0 +1,69 @@ +PODS: + - IronSourceSDK (8.8.0.0) + - MintegralAdSDK/All (7.7.7): + - MintegralAdSDK/BannerAd + - MintegralAdSDK/BidNativeAd + - MintegralAdSDK/InterstitialVideoAd + - MintegralAdSDK/NativeAd + - MintegralAdSDK/NativeAdvancedAd + - MintegralAdSDK/NewInterstitialAd + - MintegralAdSDK/RewardVideoAd + - MintegralAdSDK/SplashAd + - MintegralAdSDK/BannerAd (7.7.7): + - MintegralAdSDK/NativeAd + - MintegralAdSDK/BidNativeAd (7.7.7): + - MintegralAdSDK/NativeAd + - MintegralAdSDK/InterstitialVideoAd (7.7.7): + - MintegralAdSDK/NativeAd + - MintegralAdSDK/NativeAd (7.7.7) + - MintegralAdSDK/NativeAdvancedAd (7.7.7): + - MintegralAdSDK/NativeAd + - MintegralAdSDK/NewInterstitialAd (7.7.7): + - MintegralAdSDK/InterstitialVideoAd + - MintegralAdSDK/NativeAd + - MintegralAdSDK/RewardVideoAd (7.7.7): + - MintegralAdSDK/NativeAd + - MintegralAdSDK/SplashAd (7.7.7): + - MintegralAdSDK/NativeAd + - TPNiOS (6.4.76): + - TPNiOS/TPNSDK (= 6.4.76) + - TPNiOS/TPNSDK (6.4.76) + - TPNIronSourceSDKAdapter (6.4.76): + - IronSourceSDK (= 8.8.0.0) + - TPNiOS (= 6.4.76) + - TPNMintegralSDKAdapter (6.4.76): + - MintegralAdSDK/All (= 7.7.7) + - TPNiOS (= 6.4.76) + - TPNVungleSDKAdapter (6.4.76): + - TPNiOS (= 6.4.76) + - VungleAds (= 7.5.0) + - VungleAds (7.5.0) + +DEPENDENCIES: + - TPNiOS (= 6.4.76) + - TPNIronSourceSDKAdapter (= 6.4.76) + - TPNMintegralSDKAdapter (= 6.4.76) + - TPNVungleSDKAdapter (= 6.4.76) + +SPEC REPOS: + trunk: + - IronSourceSDK + - MintegralAdSDK + - TPNiOS + - TPNIronSourceSDKAdapter + - TPNMintegralSDKAdapter + - TPNVungleSDKAdapter + - VungleAds + +SPEC CHECKSUMS: + IronSourceSDK: ff0b14630899756847f7608a75182f10f022e5ef + MintegralAdSDK: 190c6cd3d83b31b51833e3341857c58dc430da2e + TPNiOS: 1b19f54b097912acf89dd41821605cc366432756 + TPNIronSourceSDKAdapter: 632739c889c7a52174c8e3f5e912b99a2db489c0 + TPNMintegralSDKAdapter: 67df075118c7268031c545b62e2216bba569cb22 + TPNVungleSDKAdapter: 15aa9b622b4ab59eb7a9f95d5c052d674483b585 + VungleAds: cb2aa4791ba4f341c6c026d44cc43eabe258890f + +PODFILE CHECKSUM: c9db2b56d9c1cce1499e833f0872906ef776ba87 + +COCOAPODS: 1.16.2 diff --git a/topon/template/embedded.mobileprovision b/topon/template/embedded.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..1583e4e2c4c3e754eeb55379ede62b0fd9a9914a GIT binary patch literal 12073 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

ddYDW$7gjIaiOw^l(BrAz7^Qk2QV46NbvJWHdPJ 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%0A#o(OHI4x3v5k|{I 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�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%0A6f%q~59*><^ai>|N~vv47|DYNG-+lR1< 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