ইউআইডিভাইস ইউনিকআইডেন্টিফায়ার অবমূল্যায়ন - এখন কী করবেন?


501

এটা ঠিক যে হালকা থেকে আসা হয়েছে UIDevice uniqueIdentifier সম্পত্তি অবচিত মধ্যে আইওএস 5 এবং iOS 7 এ এবং উপরোক্ত অনুপলব্ধ। কোনও বিকল্প পদ্ধতি বা সম্পত্তি উপলব্ধ বা আসন্ন বলে মনে হচ্ছে না।

আমাদের বিদ্যমান অনেক অ্যাপ্লিকেশন কোনও নির্দিষ্ট ডিভাইসকে অনন্যভাবে সনাক্ত করার জন্য এই সম্পত্তিটির উপর দৃ tight়ভাবে নির্ভরশীল। আমরা কীভাবে এই সমস্যাটি সামলাতে পারি?

২০১১-২০১২ এ ডকুমেন্টেশন থেকে দেওয়া পরামর্শটি ছিল:

বিশেষ বিবেচ্য বিষয়

ইউনিকআইডেন্টিফায়ার সম্পত্তিটি ব্যবহার করবেন না। আপনার অ্যাপ্লিকেশানের সাথে নির্দিষ্ট কোনও অনন্য সনাক্তকারী তৈরি করতে, আপনি CFUUIDCreateএকটি তৈরি করতে ফাংশনটিতে কল করতে পারেন UUIDএবং এটি NSUserDefaultsক্লাসটি ব্যবহার করে ডিফল্ট ডেটাবেজে লিখতে পারেন ।

তবে কোনও ব্যবহারকারী অ্যাপটি আনইনস্টল করে পুনরায় ইনস্টল করলে এই মানটি সমান হবে না।


1
এখনও ইউনিকআইডেন্টিফায়ার ব্যবহার করছে এমন অ্যাপ্লিকেশনগুলির জন্য, আইওএস 7 এখন এফএফএফএফএফএফএফএফ + আইডেন্টিফায়ারফোরভেন্ডারটি ফিরিয়ে দেয় যা অনেকগুলি খারাপভাবে লিখিত নন-রিনিউ করা সাবস্ক্রিপশন অ্যাপ্লিকেশনগুলিকে ভেঙে দিচ্ছে।
ছন্দবদ্ধ ফিস্টম্যান

ভাগ্যক্রমে আপনার অ্যাপ্লিকেশন পুশ বিজ্ঞপ্তিগুলি ব্যবহার করে, আপনি অ্যাপলের পুশ পরিষেবা থেকে প্রেরিত টোকেনটি ব্যবহার করতে পারেন, এটি ডিভাইস অনুযায়ীও অনন্য
ক্যালিন চিটু

@ ক্যালিনচিটু যদি ব্যবহারকারী পুশ বিজ্ঞপ্তিগুলি গ্রহণ না করে তবে আপনি কি এখনও সেই ব্যবহারকারীর জন্য পুশআইডি পাবেন?
চেজ রবার্টস

উত্তর:


272

একটি UUID নির্মিত দ্বারা CFUUIDCreate হয় অনন্য যদি একটি ব্যবহারকারী আনইনস্টল এবং অ্যাপ্লিকেশন পুনরায় ইনস্টল: আপনি একটি নতুন এক প্রতিটি সময় পাবেন।

তবে আপনি এটি অনন্য হতে চান না , অর্থাত্ ব্যবহারকারী যখন অ্যাপটি আনইনস্টল করে এবং পুনরায় ইনস্টল করেন তখন এটি একই থাকে। এর জন্য কিছুটা চেষ্টা করা দরকার, যেহেতু সবচেয়ে নির্ভরযোগ্য প্রতি-ডিভাইস-সনাক্তকারীটি ম্যাক ঠিকানা বলে মনে হচ্ছে। আপনি ম্যাককে জিজ্ঞাসা করতে এবং এটি ইউআইডি হিসাবে ব্যবহার করতে পারেন।

সম্পাদনা করুন: অবশ্যই অবশ্যই সর্বদা একই ইন্টারফেসের ম্যাকটি জিজ্ঞাসা করা দরকার। আমি অনুমান করি যে সেরা বেটটি রয়েছে en0। ইন্টারফেসের কোনও আইপি না থাকলেও / ডাউন না থাকলেও ম্যাক সর্বদা উপস্থিত থাকে।

সম্পাদনা 2: অন্যদের দ্বারা যেমনটি উল্লেখ করা হয়েছিল, আইওএস 6 এর পর থেকে পছন্দসই সমাধানটি হ'ল - [ইউআইডিভাইস আইডেন্টিফায়ারফোরভেন্ডার] । বেশিরভাগ ক্ষেত্রেই, আপনি এটি পুরানো প্রতিস্থাপন হিসাবে ড্রপ-ইন হিসাবে ব্যবহার করতে সক্ষম হবেন -[UIDevice uniqueIdentifier](তবে অ্যাপটি প্রথমবার অ্যাপ্লিকেশন শুরু হওয়ার পরে তৈরি করা একটি ইউইউডি হ'ল অ্যাপল আপনাকে ব্যবহার করতে চায় বলে মনে হয়)।

3 সম্পাদনা করুন: সুতরাং এই প্রধান পয়েন্টটি কম্পনের শব্দে হারিয়ে যাবে না: ম্যাককে ইউইউডি হিসাবে ব্যবহার করবেন না, ম্যাক ব্যবহার করে একটি হ্যাশ তৈরি করুন । সেই হ্যাশ প্রতিবারই একই ফলাফল তৈরি করবে, এমনকি পুনরায় ইনস্টল এবং অ্যাপ্লিকেশন জুড়ে (যদি হ্যাশিং একইভাবে করা হয়)। যাইহোক, আজকাল (২০১৩) আইওএস <6.0 এ আপনার কোনও "স্থিতিশীল" ডিভাইস সনাক্তকারী প্রয়োজন হলে এগুলি আর প্রয়োজন হয় না।

সম্পাদনা 4: আইওএস 7-তে, আইডি স্কিমের বেস হিসাবে ম্যাকটিকে বিশেষভাবে ব্যর্থ করার জন্য ম্যাককে জিজ্ঞাসা করার সময় অ্যাপল এখন সর্বদা একটি নির্দিষ্ট মান দেয় । সুতরাং আপনার এখন সত্যই ব্যবহার করা উচিত - [ইউআইডিভাইস আইডেন্টিফায়ার ফরভেন্ডার] বা প্রতি ইনস্টল ইউআইডি তৈরি করুন।


8
ব্যবহারকারী ওয়াইফাইয়ের মাধ্যমে সংযুক্ত আছেন কিনা তার উপর নির্ভর করে ম্যাক ঠিকানাটি পরিবর্তন হয় না?
অলিভার পিয়ারমাইন

1
@ ডার্কডাস্ট: আপনি যখন ওয়াইফাই থেকে সেলুলার মডেমে স্যুইচ করেন তখন সক্রিয় ইন্টারফেস পরিবর্তিত হয়, সক্রিয় ইন্টারফেসের ম্যাক ঠিকানাও পরিবর্তন হওয়া উচিত; আপনি সবসময়ই
ম্যাকটি

3
@ রজার নোলান: দয়া করে অন্য লোকের উত্তরগুলি সম্পাদনা করবেন না এবং এমন জিনিস যুক্ত করবেন না যা দেখে মনে হয় এটি মূল লেখকের কাছ থেকে এসেছে। ধন্যবাদ।
ডার্কডাস্ট

2
@ রোজারনোলান যতক্ষণ না পোস্ট কোনও সম্প্রদায়ের উত্তর না হয় ততক্ষণ সম্পাদনাগুলি ভুল এবং এ জাতীয় জিনিসগুলি সংশোধন করার জন্য, নতুন স্টাফ যুক্ত করার জন্য নয়। আপনি সুযোগটি অর্জন করার একটি কারণ রয়েছে। কল্পনা করুন আমি আপনার উত্তরটি সম্পাদনা করেছি এবং কিছু BS লিখেছি, লোকেরা ভাববে আপনি এটি লিখেছেন। আমার সন্দেহ আপনি চান যে :-) কিন্তু আপনি বিজ্ঞাপিত হতেন না যে একটি সম্পাদনা ঘটেছে, আমি শুধু দুর্ঘটনা দ্বারা খুঁজে পাওয়া যায় নি।
ডার্কডাস্ট

3
অ্যাপল এখন অ্যাপ্লিকেশনগুলিকে প্রত্যাখ্যান করে যা হ্যাশড ম্যাক ব্যবহার করে।
ইদান

91

আপনি UDIDইতিমধ্যে অ্যাপলের জন্য আপনার বিকল্পটি ব্যবহার করতে পারেন । কাইন্ড গাইকিটজ বিভাগে রচনা লিখেছেন UIDeviceযা UDIDডিভাইস ম্যাক-ঠিকানা এবং বান্ডেল শনাক্তকরণের উপর ভিত্তি করে এক ধরণের তৈরি করবে ।

আপনি গিথুবে কোড খুঁজে পেতে পারেন


3
অ্যাপল এর ইউনিক আইডের মতো পুনরায় স্থাপনা জুড়ে কোনও ডিভাইসটির জন্য এই বাস্তবায়ন অনন্য (ম্যাক ঠিকানা), তবে গোপনীয়তার প্রতি সম্মান জানায়, অ্যাপ্লিকেশনটির জন্যও অনন্য হয়ে থাকে (এছাড়াও বান্ডিলআইড ব্যবহার করে) ... একটিতে অবশ্যই ইমো থাকতে হবে, অ্যাপলকে তার এপিআইগুলিতে অন্তর্ভুক্ত করা উচিত। .. ডাব্লু / ও কোনও বিকল্প হ্রাস করার পরিবর্তে।
ভিনসেন্ট গেরসি

8
যদিও এটি বিজ্ঞাপনের ক্লজ, ইয়াক সহ পুরানো স্টাইলের বিএসডি লাইসেন্স ব্যবহার করে।
jbtule

8
এই পোস্টটি সন্ধানকারী অন্য কারও জন্য, jbtule দ্বারা উপরের মন্তব্য করার পরে লাইসেন্সটি পরিবর্তন করা হয়েছে।
জেমস

1
: এই আলোচনা হিসাবে মন্তব্য করুন কমিট, পাঠাগার ভঙ্গি একটি গুরুতর গোপনীয়তা লিক ইস্যু হিসেবে-এবং ব্যবহার করা উচিত নয়
উইল

15
আইওএস 7 থেকে শুরু করে, 02:00:00:00:00:00আপনি কোনও ডিভাইসে ম্যাক ঠিকানা চাইলে সিস্টেমটি সর্বদা মানটি দেয়। এখানে যাচাই করুন: বিকাশকারী.অ্যাপল.
com

61

@ ম্যানলাইট দ্বারা প্রস্তাবিত লিঙ্কের ভিত্তিতে, আমি বেশ কয়েকটি পরীক্ষা করেছি এবং এটি সেরা সমাধান বলে মনে হচ্ছে। যেমন @ ডার্কডাস্ট বলেছেন যে পদ্ধতিটি en0সর্বদা উপলব্ধ তা যাচাই করতে যায় ।
দুটি বিকল্প রয়েছে:
uniqueDeviceIdentifier(এমএসি + সিএফবান্ডিলআইডিটিফায়ার এর এমডি 5 )
এবং uniqueGlobalDeviceIdentifier(ম্যাকের এমডি 5), এগুলি সর্বদা একই মান দেয়।
আমি যে পরীক্ষাগুলি করেছি তার নীচে (আসল ডিভাইস সহ):

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

XXXX21f1f19edff198e2a2356bf4XXXX - (WIFI) ইউডিআইডি
XXXX7dc3c577446a2bcbd77935 বিডিএক্সএক্সএক্সএক্স - (WIFI) গ্লোবাল অ্যাপ্লুউডিআইডি

XXXX21f1f19edff198e2a2356bf4XXXX - (3 জি) ইউডিআইডি
XXXX7dc3c577446a2bcbd77935bdXXXX - (3 জি) গ্লোবাল অ্যাপ্লুপিড

XXXX21f1f19edff198e2a2356bf4XXXX - (জিপিআরএস) ইউডিআইডি
XXXX7dc3c577446a2bcbd77935bdXXXXX (জিপিআরএস) গ্লোবাল অ্যাপ্লুউডিআইডি

XXXX21f1f19edff198e2a2356bf4XXXX - (এয়ারপ্লেইন মোড) ইউডিআইডি
XXXX7dc3c577446a2bcbd77935bdXXXX - (এয়ারপ্লেইন মোড) গ্লোবাল অ্যাপ্লুউডিআইডি

XXXX21f1f19edff198e2a2356bf4XXXX - (Wi-Fi) অ্যাপ্লিকেশনটি সরিয়ে এবং ইনস্টল করার পরে XXXX7dc3c577446a2bcbd77935bdXXXX (Wi-Fi) অ্যাপটি সরিয়ে এবং ইনস্টল করার পরে

আশা করি এটি কার্যকর।

সম্পাদনা:
অন্যরা যেমন উল্লেখ করেছে, আইওএস in-তে এই সমাধানটি আর কার্যকর হবে না কারণ uniqueIdentifierএখন থেকে ম্যাক ঠিকানার জন্য অনুসন্ধান করা এখনি সর্বদা ফিরে আসে 02: 00: 00: 00: 00: 00


13
এটি iOS7 এ কাজ করবে না, অ্যাপল ম্যাক ঠিকানা ব্যবহার সরিয়ে দেয়।
সরিম সিদ্দ

@ সরিমসিদ্ধ এখনকার জন্য আইওএস 7 সম্পর্কিত তথ্য এনডিএর অধীনে রয়েছে, আমরা এখানে আলোচনা করতে পারি না।
মাদুর

57

এটা দেখ,

আমরা NSUserDefaultsক্লাসের পরিবর্তে কেচেইন ব্যবহার করতে পারি , UUIDতৈরির জন্য সঞ্চয় করতে CFUUIDCreate

এই উপায়ে আমরা UUIDপুনরায় ইনস্টল করে বিনোদনের জন্য এড়াতে পারি এবং UUIDএকই অ্যাপ্লিকেশনের জন্য এমনকি ব্যবহারকারীদের আনইনস্টল ও পুনরায় ইনস্টল করতে সর্বদা একইরকম ।

UUID ব্যবহারকারী দ্বারা ডিভাইস পুনরায় সেট করার সময় পুনরায় তৈরি করা হবে।

আমি SFHFKeychainUtils দিয়ে এই পদ্ধতিটি চেষ্টা করেছি এবং এটি একটি কবজির মতো কাজ করে।


33
এই পদ্ধতিটি ইউডিআইডি-র একটি কঠিন প্রতিস্থাপন। এটি ডিভাইস ফর্ম্যাট অনুসারে সনাক্তকারী পুনরায় তৈরি করার অতিরিক্ত সুবিধাও রয়েছে (যেমন, যদি ডিভাইসটির মালিক পরিবর্তন হয়)। তবে, এটি লক্ষ্য করা গুরুত্বপূর্ণ যে যদি ব্যবহারকারী তাদের ব্যাকআপটি এনক্রিপ্ট করে তবে কীচেনটি অন্য ডিভাইসে পুনরুদ্ধার করা যেতে পারে। একাধিক ডিভাইস একই ইউআইডিকে ভাগ করে নেওয়ার ফলে এমন পরিস্থিতি দেখা দিতে পারে। এটি এড়াতে, আপনার কীচেন আইটেমটির অ্যাক্সেসযোগ্যতা সেট করুন kSecAttrAccessibleAlwaysThisDeviceOnly। এটি নিশ্চিত করবে যে আপনার ইউআইডি অন্য কোনও ডিভাইসে মাইগ্রেটে না। অন্যান্য অ্যাপ্লিকেশন থেকে আপনার ইউআইডি অ্যাক্সেস করতে, kSecAttrAccessGroupকীটি ব্যবহার করুন ।
জীবন তখর

ইউইইউডিটি কীচেইনে সংরক্ষণ করার জন্য আপনার ঠিক কোথায় (কোন কী) ব্যবহার করার কথা?
ট্রান্সলেশন

বাব্বা! লিঙ্কটি ভাঙা হয়েছে
COVID19

48

আপনার নিজস্ব ইউআইডি তৈরি করুন এবং তারপরে এটি কেচেইনে সংরক্ষণ করুন। আপনার অ্যাপটি আনইনস্টল হয়ে গেলেও এটি বজায় থাকে। ব্যবহারকারী ডিভাইসগুলির মধ্যে স্থানান্তরিত করে (যেমন পুরো ব্যাকআপ এবং অন্য কোনও ডিভাইসে পুনরুদ্ধার করা) এমনকি এটি বেশিরভাগ ক্ষেত্রেও অব্যাহত থাকে।

কার্যকরভাবে এটি যতটা আপনার চিন্তিত ততই অনন্য ব্যবহারকারী শনাক্তকারী হয়ে ওঠে । ( ডিভাইস শনাক্তকারীর চেয়ে আরও ভাল )।

উদাহরণ:

আমি এটি তৈরি করার জন্য একটি কাস্টম পদ্ধতিটি সংজ্ঞায়িত করছি UUID:

- (NSString *)createNewUUID 
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

তারপরে আপনি এটিকে KEYCHAINআপনার অ্যাপ্লিকেশনের প্রথম প্রথমটিতে চালু করতে পারবেন। যাতে প্রথম প্রবর্তনের পরে, আমরা এটি কীচেইন থেকে কেবল ব্যবহার করতে পারি, এটি পুনরুত্থানের দরকার নেই। কীচেন স্টোর করার জন্য প্রধান কারণ হ'ল: আপনি যখন UUIDকেচেইনটিতে সেট করেন , এটি ব্যবহারকারী স্থিরভাবে অ্যাপটিকে আনইনস্টল করে এবং তারপরে আবার ইনস্টল করে না থাকলেও তা অবিরত থাকবে। । সুতরাং, এটি এটি সংরক্ষণ করার স্থায়ী উপায়, যার অর্থ কীটি সমস্ত উপায়ে অনন্য হবে।

     #import "SSKeychain.h"
     #import <Security/Security.h>

অ্যাপটেশন লঞ্চে নিম্নলিখিত কোডগুলি অন্তর্ভুক্ত করুন:

 // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

থেকে SSKeychain.m এবং জ ফাইল ডাউনলোড sskeychain আপনার প্রকল্পের প্রয়োজন এবং টেনে আনুন SSKeychain.m এবং জ ফাইল এবং আপনার প্রকল্পের জন্য "Security.framework" যোগ করুন। ইউআইডি ব্যবহারের পরে কেবল ব্যবহার করুন:

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];

কারণ একটি সনাক্তকারী ফরভেন্ডর কাজ করছে পুরোপুরি নয়। কিছু ক্ষেত্রে শূন্য বা 0x0 ফিরে আসতে পারে। মনে হচ্ছে এই পদ্ধতিটি নিখুঁতভাবে কাজ করছে
CReaTuS

3
এটি যাচাই করেছে যে কেউ iOS7 এ কাজ করছে আনইনস্টল / পুনরায় ইনস্টল করার পরে চক্র + যাচাই করা অ্যাপল অ্যাপ জমা দেওয়ার পরে?
মাইন্ডবম্ব

আমি এই সমাধানটি ব্যবহার শুরু করেছি। 2 টি ডিভাইসে বেশ কয়েকটি পরীক্ষা (পুনর্নির্মাণ, পুনরায় ইনস্টল, ডিভাইস শাট ডাউন) আমাকে দেখায় যে আইডি একই। আইওএস 10.3।
ডেকো

16

সম্ভবত আপনি ব্যবহার করতে পারেন:

[UIDevice currentDevice].identifierForVendor.UUIDString

অ্যাপলের ডকুমেন্টেশন শনাক্তকারী ফোর্বেন্ডারকে নীচে বর্ণনা করে:

একই ডিভাইসে চলমান একই বিক্রেতা থেকে আসা অ্যাপ্লিকেশানগুলির জন্য এই সম্পত্তিটির মান একই। বিভিন্ন বিক্রেতাদের কাছ থেকে আসা একই ডিভাইসে থাকা অ্যাপ্লিকেশনের জন্য এবং বিক্রেতাকে নির্বিশেষে বিভিন্ন ডিভাইসের অ্যাপ্লিকেশানের জন্য একটি পৃথক মান ফেরত দেওয়া হয়।


কৌতূহল কেন কেন সম্প্রতি কেউ এটিকে সামনে
আনেনি

1
ব্যবহারকারী যদি আইওএস আপডেট করে এবং / অথবা নতুন আইওগুলি ইনস্টল করে তবে পরিচয়কারীর মানটি ভেন্ডরটির পরিবর্তন হবে বা একই থাকবে?
সুনীল জালওয়াদিয়া

1
একই বিক্রেতা থেকে সমস্ত অ্যাপস সরানোর পরে এই মানটি পরিবর্তন করা হবে।
মিতেশ খাত্রি

14

OpenUDIDঅবহিতদের জন্য কোনটি ড্রপ-ইন প্রতিস্থাপন তা ব্যবহার করে আপনি বিবেচনা করতে পারেন UDID

মূলত, এর সাথে মেলে UDID, নিম্নলিখিত বৈশিষ্ট্যগুলির প্রয়োজন:

  1. অনন্য বা পর্যাপ্ত অনন্য (একটি কম সম্ভাবনার সংঘাত সম্ভবত খুব গ্রহণযোগ্য)
  2. রিবুট জুড়ে অধ্যবসায়, পুনরুদ্ধার, আনইনস্টল
  3. বিভিন্ন বিক্রেতার অ্যাপ্লিকেশন জুড়ে উপলব্ধ (সিপিআই নেটওয়ার্কের মাধ্যমে ব্যবহারকারীদের অর্জনের জন্য দরকারী) -

OpenUDID উপরেরটি পূরণ করে এবং পরে বিবেচনার জন্য একটি বিল্ট-ইন অপ্ট-আউট প্রক্রিয়াও রয়েছে।

এটি সম্পর্কিত গিটহাবের দিকে নির্দেশ করে http://OpenUDID.org দেখুন । আশাকরি এটা সাহায্য করবে!

পার্শ্ব নোট হিসাবে, আমি যে কোনও ম্যাক ঠিকানা বিকল্প থেকে লজ্জা পাব। ম্যাকের ঠিকানাটি একটি লোভনীয় এবং সর্বজনীন সমাধানের মতো প্রদর্শিত হলেও নিশ্চিত হয়ে নিন যে এই কম ঝুলন্ত ফলটি বিষযুক্ত। ম্যাক ঠিকানাটি অত্যন্ত সংবেদনশীল এবং আপনি "এই অ্যাপ্লিকেশনটি সাবমিট করুন" বলতে পারার আগে অ্যাপল খুব সহজেই এটিকে অ্যাক্সেসের অবমূল্যায়ন করতে পারে ... ম্যাক নেটওয়ার্ক ঠিকানাটি ব্যক্তিগত ল্যানের (ডাব্লুএলএএন) বা অন্যান্য ভার্চুয়াল প্রাইভেটের নির্দিষ্ট ডিভাইসগুলিকে প্রমাণীকরণ করতে ব্যবহৃত হয় নেটওয়ার্ক (ভিপিএন)। .. এটি আগের ইউডিআইডি এর চেয়েও বেশি সংবেদনশীল!


আমি সত্যিই কৌতুহলী এই কিভাবে কাজ করে? কোডটি অবজেক্টিভ-সি-তে লিখিত হয়েছে, তবে উপরের প্রয়োজনীয়তাগুলির সাথে ফিট করে এমন কোনও ভাল সমাধান নেই, তবে এই কাঠামোটি কী আলাদা করে? এই কাঠামোটি যে সমাধানটি ব্যবহার করছে তা এখানে প্রস্তাবিত উত্তর হিসাবে পোস্ট করাও সম্ভব ...
jake_hetfield

আমি সম্মতি দিয়েছি - ম্যাকের ঠিকানাটি ম্যানুয়ালি পাশাপাশি কনফিগার করা যেতে পারে ("ক্লোন করা"), যদিও এটি বেশিরভাগ অংশের জন্য সম্ভবত না। আমি অবশ্যই ইউডিআইডি-তে ডিটির প্রতিবাদ করব। এটি কোনও ডিভাইস আইডি নয়, এটি একটি ইউইউডি (সর্বজনীন ইউনিক আইডেন্টিফায়ার)। ডিওএস আইডিটি অ্যাপল দ্বারা রমের প্রতিটি ডিভাইসে কারখানা থেকে স্ট্যাম্পযুক্ত।
জে ইমারম্যান


1
ওপেনউডিআইডি হ্রাস করা হয়েছে এবং ব্যবহারের জন্য প্রস্তাবিত নয়
এমকিএল

11

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

  • ব্যবহারকারী ডিফল্টে কোনও ইউইউডি এবং স্টোর তৈরি করুন? কোনও ভাল না কারণ যখন ব্যবহারকারী অ্যাপটি মুছে ফেলেন তখন এটি স্থির থাকে না। পরে যদি তারা আবার ইনস্টল করে তবে অনলাইন পরিষেবাটি কোনও নতুন ডিভাইস রেকর্ড তৈরি করা উচিত নয়, এটি সার্ভারের সংস্থানগুলি নষ্ট করে এবং একই বা দুটি বা তার বেশি বার একই ডিভাইসগুলির একটি তালিকা দেয়। ব্যবহারকারীরা অ্যাপটি পুনরায় ইনস্টল করলে তারা একাধিক "ববসের আইফোন" তালিকাভুক্ত দেখতে পাবেন।

  • কীচেইনে একটি ইউআইডি এবং স্টোর তৈরি করবেন? এটি আমার পরিকল্পনা ছিল, যেহেতু অ্যাপটি আনইনস্টল করা হলেও এটি স্থির থাকে। তবে নতুন আইওএস ডিভাইসে আইটিউনস ব্যাকআপ পুনরুদ্ধার করার সময়, ব্যাকআপটি এনক্রিপ্ট করা থাকলে কীচেইন স্থানান্তরিত হয়। যদি পুরানো এবং নতুন ডিভাইস উভয়ই পরিষেবাতে থাকে তবে এটি একই ডিভাইস আইডি সহ দুটি ডিভাইস হতে পারে। ডিভাইসের নাম একই থাকলেও এগুলিকে অনলাইন পরিষেবাতে দুটি ডিভাইস হিসাবে তালিকাবদ্ধ করা উচিত।

  • ম্যাকের ঠিকানা এবং বান্ডিল আইডি একটি হ্যাশ তৈরি করুন? এটি আমার যা প্রয়োজন তার সেরা সমাধানের মতো দেখায়। বান্ডেল আইডি দিয়ে হ্যাশ করে, উত্পন্ন ডিভাইস আইডি অ্যাপ্লিকেশনগুলিতে ডিভাইসটিকে ট্র্যাক করতে সক্ষম করতে সক্ষম হবে না এবং আমি অ্যাপ্লিকেশন + ডিভাইস সংমিশ্রণের জন্য একটি অনন্য আইডি পাই।

মজার বিষয় এটি আকর্ষণীয় যে অ্যাপলের নিজস্ব ডকুমেন্টেশনগুলি ম্যাক অ্যাপ স্টোরের প্রাপ্তিগুলিকে সিস্টেম ম্যাকের ঠিকানা এবং বান্ডিল আইডি এবং সংস্করণটির একটি হ্যাশ গণনা করে ম্যাক অ্যাপ স্টোরের প্রাপ্তিগুলির বৈধতা বোঝায় । সুতরাং এটি নীতি অনুসারে অনুমোদিত বলে মনে হচ্ছে, এটি অ্যাপ পর্যালোচনার মধ্য দিয়ে যায় কিনা তা আমি এখনও জানি না।


10
আপনার দ্বিতীয় দফায় বর্ণিত পরিস্থিতি এড়াতে আপনার কীচেন আইটেমটির অ্যাক্সেসিবিলিটি সেট করুন kSecAttrAccessibleAlwaysThisDeviceOnly। এটি নিশ্চিত করবে যে আপনার ইউআইডি অন্যান্য ডিভাইসে পুনরুদ্ধার করবে না, এমনকি ব্যাকআপ এনক্রিপ্ট করা থাকলেও।
জীবন তখর

সত্যিই আমি এই আচরণটি বহুবার দেখেছি। উদাহরণস্বরূপ, আমি আমার আইফোনটি গুগল সিঙ্কের জন্য নিবন্ধিত করি। তারপরে আমি একটি নতুন আইফোন পেয়েছি, এটি রেজিস্টার করতে এবং ভয়েলা - আমার এখন আমার সিঙ্ক সেটিংসে 2 টি আইফোন তালিকাভুক্ত রয়েছে।
জে ইমারম্যান

11

এটি আইওএস 6 এর মতো মনে হচ্ছে, অ্যাপল আপনাকে এনএসইউইডি ক্লাসটি ব্যবহার করার পরামর্শ দিচ্ছে

সম্পত্তির জন্য ইউআইডিভাইস ডক্সে এখন বার্তাটি থেকে uniqueIdentifier:

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


10

সহায়তা করতে পারে: নীচের কোডটি ব্যবহার করুন আপনি নিজের ডিভাইসটি মুছুন (ফর্ম্যাট) বাদে সর্বদা স্বতন্ত্র will

UIDevice *myDevice=[UIDevice currentDevice];
NSString *UUID = [[myDevice identifierForVendor] UUIDString];

1
আমি এই কোডটি ব্যবহার করেছি। তবে আমি যখন অ্যাপটি
মুছলাম

1
আপনার যদি একটি শক্ত পদ্ধতি প্রয়োজন না হয় তবে এটি একটি সহজ সমাধান। আমি এখন এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করছি।
রূবেন এল

@ দুর্গাপ্রসাদ: এটি বিক্রেতার উপর নির্ভরশীলতার কারণে সর্বদা পরিবর্তিত হবে। উদাহরণস্বরূপ: ১. আপনি যদি বান্ডিলিডেনডাইফায়ার: com.abcd.com => সহ কোনও অ্যাপ্লিকেশন ইনস্টল করেন তবে তা পরিবর্তন হবে। ২. আপনি যদি বান্ডিলিডিডাইফায়ারযুক্ত দুটি অ্যাপ ইনস্টল করে রেখেছেন: com.abcd.com => তবে এটি চেনাজান হবে না (কোনও অ্যাপ্লিকেশন রাখুন)
আশ্বিন আজাদিয়া

7

আমিও থেকে পরিবর্তন সুপারিশ করবে uniqueIdentifierকরার এই ওপেন সোর্স লাইব্রেরি (2 সহজ বিভাগ সত্যিই) যে অ্যাপ বান্ডিল শনাক্তকারী সহ ডিভাইসের MAC ঠিকানা ব্যবহার আপনার অ্যাপ্লিকেশনের একটি UDID পরিবর্তে ব্যবহার করা যেতে পারে একটি অনন্য আইডি তৈরি করতে।

মনে রাখবেন যে ইউডিআইডি থেকে পৃথক এই অ্যাপ্লিকেশনটি প্রতিটি অ্যাপ্লিকেশনের জন্য আলাদা হবে।

আপনাকে কেবল অন্তর্ভুক্ত NSStringএবং UIDeviceবিভাগগুলি আমদানি করতে হবে এবং এর [[UIDevice currentDevice] uniqueDeviceIdentifier]মতো কল করতে হবে :

#import "UIDevice+IdentifierAddition.h"
#import "NSString+MD5Addition.h"
NSString *iosFiveUDID = [[UIDevice currentDevice] uniqueDeviceIdentifier]

আপনি এটি গিথুব এ এখানে পেতে পারেন:

আইওএস 5 এর জন্য ইউনিকআইডেন্টিফায়ার সহ ইউআইডিভাইস


এখানে বিভাগগুলি রয়েছে (কেবলমাত্র। মি ফাইলগুলি - শিরোলেখগুলির জন্য গিথুব প্রকল্পটি পরীক্ষা করুন):

UIDevice + + IdentifierAddition.m

#import "UIDevice+IdentifierAddition.h"
#import "NSString+MD5Addition.h"

#include <sys/socket.h> // Per msqr
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

@interface UIDevice(Private)

- (NSString *) macaddress;

@end

@implementation UIDevice (IdentifierAddition)

////////////////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark Private Methods

// Return the local MAC addy
// Courtesy of FreeBSD hackers email list
// Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
- (NSString *) macaddress{
    
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;
    
    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;
    
    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }
    
    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }
    
    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);
    
    return outstring;
}

////////////////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark Public Methods

- (NSString *) uniqueDeviceIdentifier{
    NSString *macaddress = [[UIDevice currentDevice] macaddress];
    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];  
    NSString *stringToHash = [NSString stringWithFormat:@"%@%@",macaddress,bundleIdentifier];
    NSString *uniqueIdentifier = [stringToHash stringFromMD5];  
    return uniqueIdentifier;
}

- (NSString *) uniqueGlobalDeviceIdentifier{
    NSString *macaddress = [[UIDevice currentDevice] macaddress];
    NSString *uniqueIdentifier = [macaddress stringFromMD5];    
    return uniqueIdentifier;
}

@end

NSString + + MD5Addition.m:

#import "NSString+MD5Addition.h"
#import <CommonCrypto/CommonDigest.h>

@implementation NSString(MD5Addition)

- (NSString *) stringFromMD5{
    
    if(self == nil || [self length] == 0)
        return nil;
    
    const char *value = [self UTF8String];
    
    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(value, strlen(value), outputBuffer);
    
    NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
        [outputString appendFormat:@"%02x",outputBuffer[count]];
    }
    return [outputString autorelease];
}

@end

3
আইওএস 7 থেকে শুরু করে অ্যাপল ম্যাক ঠিকানার জন্য একটি ধ্রুবক মান প্রদান করবে। এটি নিখুঁত জ্ঞান দেয়। ম্যাকের ঠিকানাটি সংবেদনশীল।
রবার্তো


4

ম্যাক ঠিকানাটি ছদ্মবেশী করা যেতে পারে যা নির্দিষ্ট ব্যবহারকারীর সাথে সামগ্রী বেঁধে রাখতে বা ব্ল্যাকলিস্টের মতো সুরক্ষা বৈশিষ্ট্যগুলি বাস্তবায়নের জন্য এ জাতীয় দৃষ্টিভঙ্গিকে অকেজো করে তোলে।

আরও কিছু গবেষণার পরে আমার কাছে মনে হয় যে আমরা এখন পর্যন্ত সঠিক বিকল্প ছাড়াই চলে এসেছি left আমি গুরুত্ব সহকারে আশা করি অ্যাপল তাদের সিদ্ধান্তের বিষয়ে পুনর্বিবেচনা করবে।

সম্ভবত অ্যাপলকে এই বিষয়টি ইমেল করা এবং / অথবা এটিতে কোনও বাগ / বৈশিষ্ট্য অনুরোধ ফাইল করা ভাল ধারণা হবে যেহেতু তারা বিকাশকারীদের পুরো পরিণতি সম্পর্কেও অবগত নয়।


13
তবে একটি বৈধ পয়েন্ট যদিও আমি বিশ্বাস করি যে ইউআইডিটি জেলব্রোকড ফোনেও ছদ্মবেশী / সুইজল করা যেতে পারে তাই প্রযুক্তিগতভাবে বিদ্যমান [ইউআইডিভাইস ইউনিকআইডেন্টিফায়ার] ঠিক ত্রুটিযুক্ত।
অলিভার পিয়ারমাইন

3
আপনি সর্বদা সার্ভারে একটি সনাক্তকারী তৈরি করতে এবং এটি ডিভাইসে সংরক্ষণ করতে পারেন। সর্বাধিক প্রয়োগ এটি এটি করে how আমি বুঝতে পারি না আইওএস প্রোগ্রামারদের কেন বিশেষ কিছু দরকার।
সুলতান

1
@ সুলতান আইওএসে কাজ করে না কারণ আপনি যদি কোনও অ্যাপ আনইনস্টল করেন তবে এর সমস্ত ডেটা চলে গেছে, তাই কোনও অনন্য ডিভাইস শনাক্তকারীকে সেভাবে গ্যারান্টি দেওয়ার কোনও উপায় নেই।
lkraider

4
যদি আপনি এটি কীচেইনে সংরক্ষণ করেন না। যাইহোক, আমি এমন কোনও অ্যাপ দেখিনি যেখানে এই সমস্যা ছিল। যদি অ্যাপ এবং ডেটা মুছে ফেলা হয় তবে আপনার একই ডিভাইস শনাক্তকারী প্রয়োজন হবে না। আপনি যদি ব্যবহারকারীকে সনাক্ত করতে চান তবে তাকে ইমেলের জন্য জিজ্ঞাসা করুন।
সুলতান

আইওএসের নতুন প্রকাশে ম্যাক অ্যাড্রেস অ্যাক্সেসও অ্যাপল নিষিদ্ধ করেছে;
উত্তর

4

UIDevice identifierForVendor আইওএস 6 এ প্রবর্তিত আপনার উদ্দেশ্যে কাজ করবে।

identifierForVendorআলফানিউমেরিক স্ট্রিং যা অ্যাপ্লিকেশন বিক্রেতার কাছে একটি ডিভাইস অনন্যভাবে চিহ্নিত করে। (শুধুমাত্র পাঠযোগ্য)

@property(nonatomic, readonly, retain) NSUUID *identifierForVendor

একই ডিভাইসে চলমান একই বিক্রেতা থেকে আসা অ্যাপ্লিকেশানগুলির জন্য এই সম্পত্তিটির মান একই। বিভিন্ন বিক্রেতাদের কাছ থেকে আসা একই ডিভাইসে অ্যাপ্লিকেশনগুলির জন্য এবং বিক্রেতার ক্ষেত্রে বিভিন্ন ডিভাইসে থাকা অ্যাপ্লিকেশানের জন্য একটি আলাদা মান ফেরত দেওয়া হয়।

আইওএস 6.0 এ উপলব্ধ এবং পরে ঘোষণা করা হয়েছে UIDevice.h

আইওএস 5 এর জন্য আইওএস -5 -এর জন্য ইউনিক ডিভাইস-ইউনিকআইডেন্টিফায়ার-সহ এই লিঙ্কটি উল্লেখ করুন


4

উপরে উল্লিখিত এসএসকিচেইন এবং কোড ব্যবহার করে। কপি / পেস্ট করার জন্য এখানে কোড (এসএসকিচেইন মডিউল যুক্ত করুন):

+(NSString *) getUUID {

//Use the bundle name as the App identifier. No need to get the localized version.

NSString *Appname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];    

//Check if we have UUID already

NSString *retrieveuuid = [SSKeychain passwordForService:Appname account:@"user"];

if (retrieveuuid == NULL)
{

    //Create new key for this app/device

    CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault);

    retrieveuuid = (__bridge_transfer NSString*)CFUUIDCreateString(kCFAllocatorDefault, newUniqueId);

    CFRelease(newUniqueId);

    //Save key to Keychain
    [SSKeychain setPassword:retrieveuuid forService:Appname account:@"user"];
}

return retrieveuuid;

}


3

নিম্নলিখিত কোডটি ইউডিআইডি পেতে সহায়তা করে:

        udid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        NSLog(@"UDID : %@", udid);

3

এই কোডটি আমি আইওএস 5 এবং আইওএস 6, 7 উভয়ের আইডি পেতে ব্যবহার করছি:

- (NSString *) advertisingIdentifier
{
    if (!NSClassFromString(@"ASIdentifierManager")) {
        SEL selector = NSSelectorFromString(@"uniqueIdentifier");
        if ([[UIDevice currentDevice] respondsToSelector:selector]) {
            return [[UIDevice currentDevice] performSelector:selector];
        }
    }
    return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}

সংকলক সতর্কতা সম্পর্কে আপনি কি করবেন PerformSelector may cause a leak because its selector is unknown?
বাসিল বাউরক

অ্যাপল এটিকে প্রত্যাখ্যান করবে বলে আপনি এই উদ্দেশ্যে আর বিজ্ঞাপনদিহি পরিচয়কর ব্যবহার করতে পারবেন না। আরো তথ্য: techcrunch.com/2014/02/03/...
codeplasma


2

আইওএস 11 ডিভাইসচেক ফ্রেমওয়ার্কটি চালু করেছে। ডিভাইসটিকে অনন্যরূপে সনাক্ত করার জন্য এটির একটি সম্পূর্ণরূপে সমাধান রয়েছে।


1

ইউডিআইডি পাওয়ার একটি কার্যকরী উপায়:

  1. অ্যাপ্লিকেশনটির ভিতরে দুটি পৃষ্ঠার সাহায্যে একটি ওয়েব সার্ভার চালু করুন: একজনের বিশেষভাবে তৈরি কারিগর মোবাইল কনফিগারেশন প্রোফাইলটি ফিরে আসা উচিত এবং অন্যটি ইউডিআইডি সংগ্রহ করা উচিত। এখানে , এখানে এবং এখানে আরও তথ্য ।
  2. আপনি অ্যাপ্লিকেশনটির ভিতরে থেকেই মোবাইল সাফারিতে প্রথম পৃষ্ঠাটি খুলুন এবং এটি আপনাকে কনফিগারেশন প্রোফাইল ইনস্টল করতে জিজ্ঞাসা করে সেটিংস.এপ্পে পুনর্নির্দেশ করে। আপনি প্রোফাইলটি ইনস্টল করার পরে, ইউডিআইডি দ্বিতীয় ওয়েব পৃষ্ঠায় প্রেরণ করা হয় এবং আপনি অ্যাপ্লিকেশনটির ভিতরে থেকে এটি অ্যাক্সেস করতে পারেন। (সেটিংস.অ্যাপের সমস্ত প্রয়োজনীয় এনটাইটেলমেন্ট এবং বিভিন্ন স্যান্ডবক্স বিধি রয়েছে)।

রাউটিংএইচটিটিপিএস সার্ভার ব্যবহার করে একটি উদাহরণ :

import UIKit
import RoutingHTTPServer

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var bgTask = UIBackgroundTaskInvalid
    let server = HTTPServer()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        application.openURL(NSURL(string: "http://localhost:55555")!)
        return true
    }

    func applicationDidEnterBackground(application: UIApplication) {
        bgTask = application.beginBackgroundTaskWithExpirationHandler() {
            dispatch_async(dispatch_get_main_queue()) {[unowned self] in
                application.endBackgroundTask(self.bgTask)
                self.bgTask = UIBackgroundTaskInvalid
            }
        }
    }
}

class HTTPServer: RoutingHTTPServer {
    override init() {
        super.init()
        setPort(55555)
        handleMethod("GET", withPath: "/") {
            $1.setHeader("Content-Type", value: "application/x-apple-aspen-config")
            $1.respondWithData(NSData(contentsOfFile: NSBundle.mainBundle().pathForResource("udid", ofType: "mobileconfig")!)!)
        }
        handleMethod("POST", withPath: "/") {
            let raw = NSString(data:$0.body(), encoding:NSISOLatin1StringEncoding) as! String
            let plistString = raw.substringWithRange(Range(start: raw.rangeOfString("<?xml")!.startIndex,end: raw.rangeOfString("</plist>")!.endIndex))
            let plist = NSPropertyListSerialization.propertyListWithData(plistString.dataUsingEncoding(NSISOLatin1StringEncoding)!, options: .allZeros, format: nil, error: nil) as! [String:String]

            let udid = plist["UDID"]! 
            println(udid) // Here is your UDID!

            $1.statusCode = 200
            $1.respondWithString("see https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/ConfigurationProfileExamples/ConfigurationProfileExamples.html")
        }
        start(nil)
    }
}

এখানে লিখিত বিষয়বস্তু রয়েছে udid.mobileconfig:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>PayloadContent</key>
        <dict>
            <key>URL</key>
            <string>http://localhost:55555</string>
            <key>DeviceAttributes</key>
            <array>
                <string>IMEI</string>
                <string>UDID</string>
                <string>PRODUCT</string>
                <string>VERSION</string>
                <string>SERIAL</string>
            </array>
        </dict>
        <key>PayloadOrganization</key>
        <string>udid</string>
        <key>PayloadDisplayName</key>
        <string>Get Your UDID</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
        <key>PayloadUUID</key>
        <string>9CF421B3-9853-9999-BC8A-982CBD3C907C</string>
        <key>PayloadIdentifier</key>
        <string>udid</string>
        <key>PayloadDescription</key>
        <string>Install this temporary profile to find and display your current device's UDID. It is automatically removed from device right after you get your UDID.</string>
        <key>PayloadType</key>
        <string>Profile Service</string>
    </dict>
</plist>

প্রোফাইল ইনস্টলেশনটি ব্যর্থ হবে (আমি প্রত্যাশিত প্রতিক্রিয়াটি প্রয়োগ করতে, ডকুমেন্টেশন দেখুন না ), তবে অ্যাপ্লিকেশনটি একটি সঠিক ইউডিআইডি পাবে। এবং আপনার মোবাইল কনফিগেও স্বাক্ষর করা উচিত ।


1

সুইফট ৩.০ এর জন্য দয়া করে নীচের কোডটি ব্যবহার করুন।

let deviceIdentifier: String = (UIDevice.current.identifierForVendor?.uuidString)!
NSLog("output is : %@", deviceIdentifier)

1
আইওএস 11 ডিভাইসচেক ফ্রেমওয়ার্কটি চালু করেছে। ডিভাইসটিকে অনন্যরূপে সনাক্ত করার জন্য এটির একটি সম্পূর্ণরূপে সমাধান রয়েছে।
সন্তোষ বোত্রে

1

তুমি ব্যবহার করতে পার

NSString *sID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

যা সমস্ত প্রয়োগে ডিভাইসের পক্ষে অনন্য unique


1

অ্যাপল আইওএস ১১-এ ডিভাইসচেক নামে একটি নতুন কাঠামো যুক্ত করেছে যা আপনাকে অনন্য সনাক্তকারীটিকে খুব সহজেই পেতে সহায়তা করবে। আরও তথ্য এই ফর্মটি পড়ুন। https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d


তবে এটির জন্য ইন্টারনেট সংযোগ দরকার, তাই না?
নিক কোভ

হ্যাঁ এর জন্য ইন্টারনেট সংযোগ দরকার।
সন্তোষ বোত্রে

0

বিকল্প অনুসন্ধানের সময় কেউ যদি এই প্রশ্নে হোঁচট খায়। আমি IDManagerক্লাসে এই পদ্ধতির অনুসরণ করেছি , এটি বিভিন্ন সমাধান থেকে সংগ্রহ। কীচেইনUtil কীচেইন থেকে পড়ার জন্য একটি মোড়ক। আপনি hashed MAC addressএক ধরণের অনন্য আইডি হিসাবে এটি ব্যবহার করতে পারেন ।

/*  Apple confirmed this bug in their system in response to a Technical Support Incident 
    request. They said that identifierForVendor and advertisingIdentifier sometimes 
    returning all zeros can be seen both in development builds and apps downloaded over the 
    air from the App Store. They have no work around and can't say when the problem will be fixed. */
#define kBuggyASIID             @"00000000-0000-0000-0000-000000000000"

+ (NSString *) getUniqueID {
    if (NSClassFromString(@"ASIdentifierManager")) {
        NSString * asiID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
        if ([asiID compare:kBuggyASIID] == NSOrderedSame) {
            NSLog(@"Error: This device return buggy advertisingIdentifier.");
            return [IDManager getUniqueUUID];
        } else {
            return asiID;
        }

    } else {
        return [IDManager getUniqueUUID];
    }
}


+ (NSString *) getUniqueUUID {
    NSError * error;
    NSString * uuid = [KeychainUtils getPasswordForUsername:kBuyassUser andServiceName:kIdOgBetilngService error:&error];
    if (error) {
        NSLog(@"Error geting unique UUID for this device! %@", [error localizedDescription]);
        return nil;
    }
    if (!uuid) {
        DLog(@"No UUID found. Creating a new one.");
        uuid = [IDManager GetUUID];
        uuid = [Util md5String:uuid];
        [KeychainUtils storeUsername:USER_NAME andPassword:uuid forServiceName:SERVICE_NAME updateExisting:YES error:&error];
        if (error) {
            NSLog(@"Error getting unique UUID for this device! %@", [error localizedDescription]);
            return nil;
        }
    }
    return uuid;
}

/* NSUUID is after iOS 6. */
+ (NSString *)GetUUID
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

#pragma mark - MAC address
// Return the local MAC addy
// Courtesy of FreeBSD hackers email list
// Last fallback for unique identifier
+ (NSString *) getMACAddress
{
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;

    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;

    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }

    if ((buf = malloc(len)) == NULL) {
        printf("Error: Memory allocation error\n");
        return NULL;
    }

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2\n");
        free(buf); // Thanks, Remy "Psy" Demerest
        return NULL;
    }

    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

    free(buf);
    return outstring;
}

+ (NSString *) getHashedMACAddress
{
    NSString * mac = [IDManager getMACAddress];
    return [Util md5String:mac];
}

+ (NSString *)md5String:(NSString *)plainText
{
    if(plainText == nil || [plainText length] == 0)
        return nil;

    const char *value = [plainText UTF8String];
    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(value, strlen(value), outputBuffer);

    NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
        [outputString appendFormat:@"%02x",outputBuffer[count]];
    }
    NSString * retString = [NSString stringWithString:outputString];
    [outputString release];
    return retString;
}

0
+ (NSString *) getUniqueUUID {
    NSError * error;
    NSString * uuid = [KeychainUtils getPasswordForUsername:kBuyassUser andServiceName:kIdOgBetilngService error:&error];
    if (error) {
    NSLog(@"Error geting unique UUID for this device! %@", [error localizedDescription]);
    return nil;
    }
    if (!uuid) {
        DLog(@"No UUID found. Creating a new one.");
        uuid = [IDManager GetUUID];
        uuid = [Util md5String:uuid];
        [KeychainUtils storeUsername:USER_NAME andPassword:uuid forServiceName:SERVICE_NAME updateExisting:YES error:&error];
        if (error) {
            NSLog(@"Error getting unique UUID for this device! %@", [error localizedDescription]);
            return nil;
        }
    }
    return uuid;
}

0

আমরা আইওএস 7 এর জন্য সনাক্তকারী ফরওয়ার্ডার ব্যবহার করতে পারি,

-(NSString*)uniqueIDForDevice
{
    NSString* uniqueIdentifier = nil;
    if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) { // >=iOS 7
        uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    } else { //<=iOS6, Use UDID of Device       
            CFUUIDRef uuid = CFUUIDCreate(NULL);
            //uniqueIdentifier = ( NSString*)CFUUIDCreateString(NULL, uuid);- for non- ARC
            uniqueIdentifier = ( NSString*)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));// for ARC
            CFRelease(uuid);
         }
    }
return uniqueIdentifier;
}

--গুরুত্বপূর্ণ তথ্য ---

ইউডিআইডি এবং শনাক্তকারী ফরভেন্ডার আলাদা: ---

1.) On uninstalling  and reinstalling the app identifierForVendor will change.

2.) The value of identifierForVendor remains the same for all the apps installed from the same vendor on the device.

3.) The value of identifierForVendor also changes for all the apps if any of the app (from same vendor) is reinstalled.

তুমি কি নিশ্চিত ? আমরা আইওএস 7 এর জন্য আইডেন্টিফায়ারফরভেন্ডার ব্যবহার করতে পারি?
এভিস

0

অ্যাপল আইওএস starting দিয়ে শুরু করে সমস্ত পাবলিক এপিআই থেকে ইউডিআইডিটি লুকিয়ে রেখেছে এফএফএফএফ দিয়ে শুরু হওয়া যে কোনও ইউডিআইডি একটি নকল আইডি। পূর্বে কাজ করা "ইউডিআইডি প্রেরণ করুন" অ্যাপ্লিকেশনগুলি আর পরীক্ষার ডিভাইসের জন্য ইউডিআইডি সংগ্রহ করতে ব্যবহার করা যাবে না। (দীর্ঘশ্বাস!)

ইউডিআইডি দেখানো হয় যখন কোনও ডিভাইস এক্সকোডের সাথে সংযুক্ত থাকে (সংগঠকটিতে), এবং ডিভাইসটি আইটিউনসের সাথে সংযুক্ত থাকে (যদিও আপনাকে পরিচয়দায়কটি প্রদর্শনের জন্য 'সিরিয়াল নম্বর' এ ক্লিক করতে হবে।

যদি কোনও ডিভাইসকে প্রভিশনিং প্রোফাইলে যোগ করার জন্য আপনার ইউডিআইডি হওয়া দরকার এবং আপনি এটি এক্সকোডে নিজে করতে না পারেন তবে আপনাকে এটি আইটিউনস থেকে অনুলিপি / আটকানোর পদক্ষেপগুলির মধ্য দিয়ে যেতে হবে।

(আইওএস 7 এর প্রকাশ) পিসি / ম্যাকের আইটিউনস ব্যবহার না করে ইউডিআইডি পাওয়ার কোনও উপায় আছে?


0

আমিও কিছু সমস্যা পেয়েছি, এবং সমাধানটি সহজ:

    // Get Bundle Info for Remote Registration (handy if you have more than one app)
    NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];


    // Get the users Device Model, Display Name, Unique ID, Token & Version Number
    UIDevice *dev = [UIDevice currentDevice];
    NSString *deviceUuid=[dev.identifierForVendor  UUIDString];

    NSString *deviceName = dev.name;

0

একটি নিখুঁত নয় তবে ইউডিআইডি-র সেরা এবং নিকটতম বিকল্পগুলির মধ্যে একটি (আইওএস 8.1 এবং এক্সকোড 6.1 ব্যবহার করে সুইফটে):

একটি এলোমেলো ইউইউডি তৈরি করা হচ্ছে

let strUUID: String = NSUUID().UUIDString

এবং কীচেন র‍্যাপার লাইব্রেরি ব্যবহার করুন :

কীচেইনে একটি স্ট্রিং মান যুক্ত করুন:

let saveSuccessful: Bool = KeychainWrapper.setString("Some String", forKey: "myKey")

কীচেইন থেকে একটি স্ট্রিং মান পুনরুদ্ধার করুন:

let retrievedString: String? = KeychainWrapper.stringForKey("myKey")

কীচেন থেকে স্ট্রিংয়ের মানটি সরান:

let removeSuccessful: Bool = KeychainWrapper.removeObjectForKey("myKey")

এই সমাধানটি কীচেইন ব্যবহার করে, সুতরাং অ্যাপটি আনইনস্টল ও পুনরায় ইনস্টল করার পরেও কীচেইনে সঞ্চিত রেকর্ডটি বহাল থাকবে। এই রেকর্ডটি মোছার একমাত্র উপায় হ'ল ডিভাইসের সমস্ত সামগ্রী এবং সেটিংস পুনরায় সেট করা। এ কারণেই আমি উল্লেখ করেছি যে প্রতিস্থাপনের এই সমাধানটি নিখুঁত নয় তবে সুইফট ব্যবহার করে আইওএস 8.1-এ ইউডিআইডি প্রতিস্থাপনের সেরা সমাধানগুলির মধ্যে একটি থেকে যায়।


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