ios - আইফোন ব্যক্তিগত লাইব্রেরি ছাড়া এসএসআইডি পেতে




iphone xcode (6)

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

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

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


IOS 10 এবং আপ জন্য আপডেট

CNCopySupportedInterfaces আর iOS 10 এ বর্জন করা হয় না। ( API রেফারেন্স )

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

এখানে দ্রুত একটি কোড স্নিপেট (RikiRiocma এর উত্তর) :

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 সিমুলেটারে নিল ফেরত দেয়।)

উদ্দেশ্য-সি- এর জন্য এখানে এবং নীচে এসাদ এর উত্তর দেখুন

+ (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 হিসাবে ক্যাপিটেভ নেটওয়ার্ক অপ্রচলিত *। ( source )

* আইওএস 10 আর নেই, উপরে দেখুন।

এটি আপনাকে NEHotspotHelper ( source ) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে

আপনি [email protected] এ আপেল ইমেল করতে এবং এনটাইটেলমেন্টের অনুরোধ করতে হবে। ( source )

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

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;
}

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


আইওএস 7 বা 8 হিসাবে, আপনি এটি করতে পারেন যা এআরসি এবং মডিউলগুলির সুবিধা নেয় যা স্বয়ংক্রিয়ভাবে প্রয়োজনীয় কাঠামোর সাথে লিঙ্ক করবে:

@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;
}

(এটি iOS 4.1+ এর জন্য লেখা একটি কোড নমুনাটির আধুনিকীকরণ। কেবলমাত্র পরিবর্তনগুলি পরিবর্তনশীল পরিবর্তনশীল নাম এবং এআরসি এবং মডিউলগুলি গ্রহণ করা হয়েছে।)

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

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>;
}

সিমুলেটর সমর্থিত কোন আইএফএস নোট করুন। আপনার ডিভাইস পরীক্ষা।

4.1 এর আগে, আপনি সিস্টেম কনফিগারেশন অভিধানের মাধ্যমে স্পেলকিংয়ের কিছু ভাগ্য থাকতে পারে। উদাহরণস্বরূপ, আমার ম্যাকের scutil ব্যবহার করে:

$ scutil
> show State:/Network/Interface/en1/AirPort
<dictionary> {
  Power Status : 1
  SecureIBSSEnabled : FALSE
  BSSID : <data> 0xcafecafecafe
  SSID_STR : XXXX
  SSID : <data> 0x012345670123456701234567
  Busy : FALSE
  CHANNEL : <dictionary> {
    CHANNEL : 1
    CHANNEL_FLAGS : 10
  }
}
> exit

আইওএস 1২

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

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

সুইফট 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

}

এই কোড SSID পেতে যাতে ভাল কাজ করে।

#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>;

}


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

#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;
}

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

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

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")
}

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








ssid