আইফোন বেসরকারী লাইব্রেরি ছাড়াই এসএসআইডি পান


154

আমার কাছে একটি বাণিজ্যিক অ্যাপ্লিকেশন রয়েছে যার সাথে এটি সংযুক্ত রয়েছে এমন নেটওয়ার্কের এসএসআইডি দেখার সম্পূর্ণ বৈধ কারণ রয়েছে: যদি এটি তৃতীয় পক্ষের হার্ডওয়্যার ডিভাইসের জন্য অ্যাডহক নেটওয়ার্কের সাথে সংযুক্ত থাকে তবে এটির চেয়ে আলাদা পদ্ধতিতে কাজ করা দরকার ইন্টারনেটে সংযুক্ত।

এসএসআইডি পাওয়ার বিষয়ে আমি যা কিছু দেখেছি সেগুলি আমাকে Apple80211 ব্যবহার করতে হবে যা আমি বুঝতে পারি যে এটি একটি ব্যক্তিগত লাইব্রেরি। আমি আরও পড়লাম যে আমি যদি একটি প্রাইভেট লাইব্রেরি ব্যবহার করি তবে অ্যাপল অ্যাপ্লিকেশনটিকে অনুমোদন দেবে না।

আমি কি কোনও অ্যাপল এবং একটি শক্ত জায়গার মধ্যে আটকে রয়েছি, বা এখানে আমি এখানে কিছু মিস করছি?


সংশ্লিষ্ট: stackoverflow.com/questions/351954/...
Senseful

উত্তর:


186

আইওএস 7 বা 8 হিসাবে, আপনি এটি করতে পারেন (আইওএস 12+ এর জন্য এনটাইটেলমেন্টের নীচে দেখানো দরকার):

@import SystemConfiguration.CaptiveNetwork;

/** Returns first non-empty SSID network info dictionary.
 *  @see CNCopyCurrentNetworkInfo */
- (NSDictionary *)fetchSSIDInfo {
    NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
    NSLog(@"%s: Supported interfaces: %@", __func__, interfaceNames);

    NSDictionary *SSIDInfo;
    for (NSString *interfaceName in interfaceNames) {
        SSIDInfo = CFBridgingRelease(
            CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
        NSLog(@"%s: %@ => %@", __func__, interfaceName, SSIDInfo);

        BOOL isNotEmpty = (SSIDInfo.count > 0);
        if (isNotEmpty) {
            break;
        }
    }
    return SSIDInfo;
}

উদাহরণ আউটপুট:

2011-03-04 15:32:00.669 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: Supported interfaces: (
    en0
)
2011-03-04 15:32:00.693 ShowSSID[4857:307] -[ShowSSIDAppDelegate fetchSSIDInfo]: en0 => {
    BSSID = "ca:fe:ca:fe:ca:fe";
    SSID = XXXX;
    SSIDDATA = <01234567 01234567 01234567>;
}

নোট করুন যে কোনও ifs সিমুলেটারে সমর্থিত নয়। আপনার ডিভাইসে পরীক্ষা করুন।

আইওএস 12

আপনাকে অবশ্যই ক্ষমতা থেকে অ্যাক্সেস ওয়াইফাই তথ্য সক্ষম করতে হবে।

গুরুত্বপূর্ণ আইওএস 12 এবং এর পরে এই ফাংশনটি ব্যবহার করতে, এক্সকোডে আপনার অ্যাপ্লিকেশনটির জন্য অ্যাক্সেস ওয়াইফাই তথ্য সক্ষমতা সক্ষম করুন। আপনি যখন এই ক্ষমতা সক্ষম করেন, এক্সকোড স্বয়ংক্রিয়ভাবে আপনার এনটাইটেলমেন্ট ফাইল এবং অ্যাপ আইডিতে অ্যাক্সেস ওয়াইফাই তথ্য এনটাইটেলমেন্ট যুক্ত করে। ডকুমেন্টেশন লিঙ্ক

সুইফট 4.2

func getConnectedWifiInfo() -> [AnyHashable: Any]? {

    if let ifs = CFBridgingRetain( CNCopySupportedInterfaces()) as? [String],
        let ifName = ifs.first as CFString?,
        let info = CFBridgingRetain( CNCopyCurrentNetworkInfo((ifName))) as? [AnyHashable: Any] {

        return info
    }
    return nil

}

8
ধন্যবাদ! আপনি যদি এআরসি ব্যবহার করে থাকেন তবে দেখতে এটির মতো দেখতে হবে: - (আইডি) ফেচ এসএসআইডিআইএনফো {এনএসআরাই * ifs = ( সেতু_ ট্রান্সফার আইডি) সিএনপি কপি সমর্থনপ্রাপ্ত ইন্টারফেস (); এনএসএলগ (@ "% s: সমর্থিত ইন্টারফেস:% @", _ফঙ্ক , আইএফএস); আইডি তথ্য = শূন্য; (এনএসএসআরিং * ইফনাম ইন আইফএস) {তথ্য = ( সেতু_ ট্রান্সফার আইডি) সিএনকপি কভারেন্ট নেট নেটওয়ার্কআইএনফো (( _ব্রিজ সিএফএস স্ট্রিংআরফ) ifnam); এনএসএলগ (@ "% s:% @ =>% @", __func , ইফনাম, তথ্য); যদি (তথ্য && [তথ্য গণনা]) {বিরতি; }} তথ্য ফেরত; }
এলসুরুদো

1
+1 দুর্দান্ত কাজ করে! আপনার প্রকল্পে [+] ফ্রেমওয়ার্ক যুক্ত / যুক্ত করতে ভুলবেন না। আপনি যদি এই পদ্ধতিটি ব্যবহার করার সময় অদ্ভুত সংকলন ত্রুটি দেখতে পান যা সম্ভবত আপনার সমস্যা। উদাহরণস্বরূপ, প্রত্যাবর্তিত অভিধানটি ব্যবহার করে এসএসআইডি পান // আইফোনটি এনএসডিকোয়্যার * নেটওয়ার্কডিক্টের সাথে সংযুক্ত থাকে নেটওয়ার্কের তথ্য সম্বলিত একটি অভিধানের জিনিস পাওয়া; // নেটওয়ার্ক তথ্য থেকে এসএসআইডি নির্বাচন করুন এনএসএসটিং * আইফোন নেটওয়ার্কএসআইডি = [নেটওয়ার্কডিক্ট অবটেক্টফোরকি: @ "এসএসআইডি"];
গ্রুট

কেউ কি জানে যে বিএসএসআইডি কি? এটি কোনও রাউটারের ম্যাক ঠিকানার মতো দেখায় তবে এটি আসলে তা নয়। এটি ডিভাইসের ম্যাক ঠিকানা নয়।
পিটোন

1
@ ফিলিপ আপডেট করা এআরসি-বান্ধব কোড ঠিকানাটি মডিউল সহ অন্তর্ভুক্ত করে ( @importপরিবর্তে #import) ব্যবহার করে । ঝাঁকুনি কেবলমাত্র একটি শিরোনামের পরিবর্তে একটি মডিউল আমদানি করা হলে প্রয়োজনীয় কাঠামোর সাথে স্বয়ংক্রিয়ভাবে লিঙ্ক হয়ে যায়।
জেরেমি ডব্লিউ শেরম্যান

1
আইওএস 13 বিটাতে এখন CNCopyCurrentNetworkInfoদরকারী তথ্য ফেরত দেওয়ার সক্ষমতা ছাড়াও অবস্থানের অনুমতি প্রয়োজন ; অন্যথায় এটি ফিরে আসে nil। দেখুন: stackoverflow.com/questions/56583650/...
RedMatt

61

@ এলসুরুদোর কোডের উপর ভিত্তি করে এখানে পরিষ্কার করা আরসি সংস্করণটি রয়েছে:

- (id)fetchSSIDInfo {
     NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();
     NSLog(@"Supported interfaces: %@", ifs);
     NSDictionary *info;
     for (NSString *ifnam in ifs) {
         info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
         NSLog(@"%@ => %@", ifnam, info);
         if (info && [info count]) { break; }
     }
     return info;
}

1
এটি সত্যই পছন্দসই উত্তর হওয়া উচিত কারণ এটি আরসি ব্যবহার করে। আমি প্রথম থেকেই এটিকে মিস করেছি কারণ এটি উত্তম উত্তর ছিল না।
জোহান কার্লসন

@mindbomb অধিকার, এখানে যে সমস্যা সম্পর্কে একটি প্রশ্ন হল: stackoverflow.com/questions/31555640/...
newenglander

হ্যাঁ, অ্যাপল আইওএস 9 বিটাতে অবমূল্যায়নের পরে ক্যাপটিভ নেটওয়ার্ক এপিআই পুনরায় সক্ষম করেছে ..
মাইন্ডবম্ব

@ মাইন্ডবম্ব এখনও কি এমন অবস্থা? এটি বাস্তবায়নে আমার সমস্যা হচ্ছে।
স্যাম ইয়ুংওয়াই 21

@ সাম YoungNY নোট করুন যে এটি কেবলমাত্র ডিভাইসে কাজ করে, সিমুলেটারে একটি খালি ফিরে আসে
এসাদ

60

আইওএস 10 এবং তারপরের জন্য আপডেট করুন

CNCopySupportedInterfaces এখন আর আইওএস 10-এ অবচয় করা হয় না is ( এপিআই রেফারেন্স )

আপনার দ্বারা আমদানি করা প্রয়োজন SystemConfiguration / CaptiveNetwork.h যোগ SystemConfiguration.framework (বিল্ড পর্যায়ক্রমে অধীনে) আপনার টার্গেট এর লিঙ্কড লাইব্রেরী।

সুইফটে একটি কোড স্নিপেট এখানে রয়েছে (রিকিওরকমার উত্তর) :

import Foundation
import SystemConfiguration.CaptiveNetwork

public class SSID {
    class func fetchSSIDInfo() -> String {
        var currentSSID = ""
        if let interfaces = CNCopySupportedInterfaces() {
            for i in 0..<CFArrayGetCount(interfaces) {
                let interfaceName: UnsafePointer<Void> = CFArrayGetValueAtIndex(interfaces, i)
                let rec = unsafeBitCast(interfaceName, AnyObject.self)
                let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)")
                if unsafeInterfaceData != nil {
                    let interfaceData = unsafeInterfaceData! as Dictionary!
                    currentSSID = interfaceData["SSID"] as! String
                }
            }
        }
        return currentSSID
    }
}

( গুরুত্বপূর্ণ: CNCopySupportedInterfaces আয় কাল্পনিক উপর Nil।)

অবজেক্টিভ-সি এর জন্য, এ্যাসাদের উত্তর এখানে এবং নীচে দেখুন

+ (NSString *)GetCurrentWifiHotSpotName {    
    NSString *wifiName = nil;
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *ifnam in ifs) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
        if (info[@"SSID"]) {
            wifiName = info[@"SSID"];
        }
    }
    return wifiName;
}

আইওএস 9 এর জন্য আপডেট করুন

আইওএস 9 হিসাবে ক্যাপটিভ নেটওয়ার্ক অবচিত করা হয়েছে *। ( উত্স )

* আর আইওএস 10-এ আর অবচয় করা হয়নি, উপরে দেখুন।

আপনি NEHotspotHelper ( উত্স ) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে

আপনাকে নেটওয়ারকেটিশন @ অ্যাপল ডট কম এ অ্যাপেল ইমেল করতে হবে এবং এনটাইটেলমেন্টগুলির জন্য অনুরোধ করতে হবে। ( উত্স )

নমুনা কোড ( আমার কোড নয় P পাবলো এ এর ​​উত্তর দেখুন ):

for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {
    NSString *ssid = hotspotNetwork.SSID;
    NSString *bssid = hotspotNetwork.BSSID;
    BOOL secure = hotspotNetwork.secure;
    BOOL autoJoined = hotspotNetwork.autoJoined;
    double signalStrength = hotspotNetwork.signalStrength;
}

পার্শ্ব দ্রষ্টব্য: হ্যাঁ, তারা আইওএস 9-এ সিএনকপি সমর্থনপ্রসূত ইন্টারফেসগুলি অবমূল্যায়ন করেছে এবং আইওএস 10 এ তাদের অবস্থানকে বিপরীত করেছে। আমি একটি অ্যাপল নেটওয়ার্কিং ইঞ্জিনিয়ারের সাথে কথা বলেছিলাম এবং অনেক লোক রাডার দায়ের করার পরে এবং অ্যাপল বিকাশকারী ফোরামে বিষয়টি নিয়ে কথা বলার পরে এই উল্টাপাল্টা এসেছিল।


নেটওয়ার্ক এক্সটেনশনটি ব্যবহার করার জন্য আমি অ্যাপল দ্বারা অনুমোদিত হয়েছি, তবে আমি এখনও [NEHotspotHelper সমর্থিত নেট ওয়ার্কআইন্টারফেস] থেকে খালি অ্যারে পেয়েছি। আপনি কি সম্ভাব্য কারণটি জানেন?
JZAU

28

এটি ডিভাইসে আমার জন্য কাজ করে (সিমুলেটর নয়)। আপনি সিস্টেম কনফিগারেশন ফ্রেমওয়ার্ক যুক্ত করেছেন তা নিশ্চিত করুন।

#import <SystemConfiguration/CaptiveNetwork.h>

+ (NSString *)currentWifiSSID {
    // Does not work on the simulator.
    NSString *ssid = nil;
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    for (NSString *ifnam in ifs) {
        NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
        if (info[@"SSID"]) {
            ssid = info[@"SSID"];
        }
    }
    return ssid;
}

10

এই কোডটি এসএসআইডি পাওয়ার জন্য ভালভাবে কাজ করে।

#import <SystemConfiguration/CaptiveNetwork.h>

@implementation IODAppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{


CFArrayRef myArray = CNCopySupportedInterfaces();
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
NSLog(@"Connected at:%@",myDict);
NSDictionary *myDictionary = (__bridge_transfer NSDictionary*)myDict;
NSString * BSSID = [myDictionary objectForKey:@"BSSID"];
NSLog(@"bssid is %@",BSSID);
// Override point for customization after application launch.
return YES;
}

এবং এটি ফলাফল:

Connected at:{
BSSID = 0;
SSID = "Eqra'aOrange";
SSIDDATA = <45717261 27614f72 616e6765>;

}


1
নিখুঁতভাবে কাজ করেছেন।
ইয়মো

9

আপনি যদি আইওএস 12 চালাচ্ছেন তবে আপনাকে একটি অতিরিক্ত পদক্ষেপ করতে হবে। আমি এই কোডটিকে কাজ করার জন্য লড়াই করে যাচ্ছি এবং অবশেষে অ্যাপলের সাইটে এটি পেয়েছি: "গুরুত্বপূর্ণ এই আইওএস 12 এবং এর পরে এই কার্যটি ব্যবহার করার জন্য, এক্সকোডে আপনার অ্যাপ্লিকেশনটির জন্য অ্যাক্সেস ওয়াইফাই তথ্য সক্ষমতা সক্ষম করুন cap আপনি যখন এই ক্ষমতা সক্ষম করেন, তখন এক্সকোড স্বয়ংক্রিয়ভাবে আপনার এনটাইটেলমেন্ট ফাইল এবং অ্যাপ আইডিতে অ্যাক্সেস ওয়াইফাই তথ্য এনটাইটেলমেন্ট যুক্ত করে। " https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo


আপনাকে ধন্যবাদ, এটা আমার সমস্যা স্থির!
ডেভিড 72


5

এখানে সংক্ষিপ্ত এবং মিষ্টি সুইফ্ট সংস্করণ।

ফ্রেমওয়ার্ক লিঙ্ক এবং আমদানি মনে রাখবেন:

import UIKit
import SystemConfiguration.CaptiveNetwork

পদ্ধতিটি সংজ্ঞায়িত করুন:

func fetchSSIDInfo() -> CFDictionary? {
    if let
        ifs = CNCopySupportedInterfaces().takeUnretainedValue() as? [String],
        ifName = ifs.first,
        info = CNCopyCurrentNetworkInfo((ifName as CFStringRef))
    {
        return info.takeUnretainedValue()
    }
    return nil
}

আপনার প্রয়োজন হলে পদ্ধতিটি কল করুন:

if let
    ssidInfo = fetchSSIDInfo() as? [String:AnyObject],
    ssID = ssidInfo["SSID"] as? String
{
    println("SSID: \(ssID)")
} else {
    println("SSID not found")
}

অন্য কোথাও উল্লিখিত হিসাবে এটি কেবলমাত্র আপনার আইডিওয়াইসে কাজ করে। যখন ওয়াইফাই-তে নেই, তখন পদ্ধতিটি শূন্য হয়ে যাবে - সুতরাং theচ্ছিক।


2

আইওএস 13 এর জন্য

আইওএস 13 এর মতো আপনার অ্যাপ্লিকেশনটির বর্তমান নেটওয়ার্কটি কনফিগার না করা বা ভিপিএন কনফিগারেশন না থাকলে CNCopyCurrentNetworkInfo ফাংশনটি ব্যবহার করার জন্য মূল অবস্থান অ্যাক্সেসের প্রয়োজন :
https://developer.apple.com/docamentation/systemconfigration/1614126-cncopycurrentnetworkinfo?language=objc থেকে সংক্ষিপ্তসার

সুতরাং আপনার যা প্রয়োজন তা হল ( অ্যাপল ডকুমেন্টেশন দেখুন ):
- CoreLocation.frameworkলাইব্রেরিটি লিঙ্ক করুন
- ইনফো.পিস্টে কী / মান location-servicesহিসাবে যুক্ত করুন - আপনার অ্যাপ্লিকেশনটির কেন মূল অবস্থান প্রয়োজন তা বর্ণনা করে তথ্য.পিস্টিতে একটি কী / মান যুক্ত করুন - "অ্যাক্সেস ওয়াইফাই যুক্ত করুন" তথ্য "আপনার অ্যাপ্লিকেশনটির জন্য এনটাইটেলমেন্ট UIRequiredDeviceCapabilities
NSLocationWhenInUseUsageDescription

এখন উদ্দেশ্য-সি উদাহরণ হিসাবে, প্রথমে নেটওয়ার্ক তথ্য পড়ার আগে অবস্থানের অ্যাক্সেস গ্রহণ করা হয়েছে কিনা তা পরীক্ষা করুন CNCopyCurrentNetworkInfo:

- (void)fetchSSIDInfo {
    NSString *ssid = NSLocalizedString(@"not_found", nil);

    if (@available(iOS 13.0, *)) {
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
            NSLog(@"User has explicitly denied authorization for this application, or location services are disabled in Settings.");
        } else {
            CLLocationManager* cllocation = [[CLLocationManager alloc] init];
            if(![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){
                [cllocation requestWhenInUseAuthorization];
                usleep(500);
                return [self fetchSSIDInfo];
            }
        }
    }

    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    id info = nil;
    for (NSString *ifnam in ifs) {
        info = (__bridge_transfer id)CNCopyCurrentNetworkInfo(
            (__bridge CFStringRef)ifnam);

        NSDictionary *infoDict = (NSDictionary *)info;
        for (NSString *key in infoDict.allKeys) {
            if ([key isEqualToString:@"SSID"]) {
                ssid = [infoDict objectForKey:key];
            }
        }
    }        
        ...
    ...
}

যে iOS13 নেওয়ার প্রয়োজন নেই, অন্যথায় আপনি পেয়েছেন শূন্য জন্য CNCopyCurrentNetworkInfo ()
ফ্রাঞ্জ ওয়াং

@ সুগার হ্যাঁ সত্যই আইওএস 13 - আমার উত্তরের প্রথম লাইনটি দেখুন
ফ্রাঙ্কোইস বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.