আইওএস কীচেন ব্যাকগ্রাউন্ড থেকে মানগুলি পুনরুদ্ধার করছে না


87

আমি বর্তমানে আইওএস কীচেইনে ব্যবহারকারীর নাম (ইমেল) এবং ইমেল এবং পাসওয়ার্ডের একটি সল্টেড হ্যাশ সংরক্ষণ করছি। আমি এখানে পাওয়া ARC'ified সংস্করণ ব্যবহার করছি ।

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

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

মনে রাখবেন, এটি কেবল বিক্ষিপ্তভাবে ঘটে এবং আমি এখনও এটি নির্দিষ্ট আইওএস সংস্করণ বা ডিভাইসে পিন করতে পারিনি।

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

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

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

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

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

উত্তর:


110

আমার প্রশ্নটি কারণটির চিহ্নের কাছাকাছি ছিল, তবে বেশ নয়। ব্লগের পরে ব্লগ পড়ার পরে, টিউটোরিয়াল পরে টিউটোরিয়াল, আমি শেষ পর্যন্ত এমন একটি পেয়েছি যা ঘটতে পারে তার ইঙ্গিত দিয়েছিল।

তালাবদ্ধ হোম স্ক্রিন। কীচেইন টিউটোরিয়ালগুলি সর্বদা কীচেনের অ্যাক্সেসযোগ্যতার সেটিংস ফাঁকা রেখে দেয়, তাই এটি অ্যাপলের সর্বনিম্ন / সুরক্ষিত অ্যাক্সেস স্তরে ডিফল্ট হয়ে যায়। এই স্তরটি যদি ব্যবহারকারীর লক স্ক্রিনে একটি পাসকোড থাকে তবে কিচেন অ্যাক্সেসের অনুমতি দেয় না। বিঙ্গো! এটি বিক্ষিপ্ত আচরণটি ব্যাখ্যা করে এবং কেন এটি কেবলমাত্র কয়েক শতাংশ ব্যবহারকারীর সাথে ঘটে।

কোডের একটি লাইন, পুরো গণ্ডগোলের সমাধান করে।

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

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


4
ধন্যবাদ! এটি খুব সহায়ক ছিল।
রিচ ওয়াটারস

4
আমরা আক্ষরিক সাথে কয়েক সপ্তাহ ধরে এটি মোকাবেলা করছি। আপনি জীবন রক্ষাকারী!
ওসি রিকার্ড

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

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

7
এখানে @ জোয়ে হেডডর্ন প্রতিধ্বনিত করে - ডাব্লুডাব্লুডিসি 2013 সেশন 204 "মাল্টিটাস্কিংয়ের সাথে নতুন কী" 4444 চিহ্ন এবং ডাব্লুডব্লিউডিসি 2013 সেশন 709 "কেচেইন সহ গোপনীয় সুরক্ষা" 25:30 চিহ্নে শুনুন। আপনি এই আলোচনার পাঠ্য সামগ্রীটি asciiwwdc.com
শ্যাজ্রন

64

kSecAttrAccessibleAfterFirstUnlockপরিবর্তে ব্যবহার করুন kSecAttrAccessibleAlways


থেকে অ্যাপলের ডকুমেন্টেশন :

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

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


4
এই উত্তরটি একটি মন্তব্য হওয়া উচিত ...
ফ্রিজ্লাব

এই উত্তরটি নিখুঁত বলে মনে হচ্ছে কারণ kSecAttrAccessibleAlwaysইতিমধ্যে
অবহেলা করা

1

আমার ক্ষেত্রে, ওয়াচওএস 2 আইওএসের পক্ষ থেকে কীচেন ডেটা অ্যাক্সেস করে।

শুরুতে, কেসঅ্যাক্ট্র অ্যাক্সেসিবল যখন আনলকডএই ডিভাইসঅনলি ব্যবহার করা হয়। আইফোনটি লক করা আছে কি না তা আমি ডেটা পড়তে পারি। এটি আমার কাছে খুব বিভ্রান্তিকর যে ঘড়িটি কীচেনটি অ্যাক্সেস করার চেষ্টা করার সময় আমি ত্রুটিটি পেয়ে যাব:: সেকট্রুস্ট মূল্যায়ন [লিফ ইস্যুয়ারকমনন সাবজেক্টকমননেম]

এবং কিছু ক্ষেত্রে এটি হয়ে উঠবে: SecOSStatusWith ত্রুটি: [- 25308] ত্রুটি ডোমেন = NSOSStatusErrorDomain কোড = -25308 "ks_crypt: e00002e2 'ও' আইটেম ব্যর্থ হয়েছে (শ্রেণি 6, ব্যাগ: 0) আইটেমটিতে অ্যাক্সেস চেষ্টা করা হয়েছে যখন কেচেন লক করা আছে। " ইউজারআইএনফো = {এনএসডিসিফিকেশন = কেএস_ক্রিপ্ট: e00002e2 'ও' আইটেমটিতে ব্যর্থ হয়েছে (শ্রেণি 6, ব্যাগ: 0) কীচেইন লক থাকা অবস্থায় আইটেমটিতে অ্যাক্সেসের চেষ্টা করা হয়েছে}

আমি আরও ইনফস পেলে আমার উত্তর আপডেট করব।


0

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

+(BOOL) isKeychainAccessible
{
    NSString *keychainTestKey = @"keychainTestKey";
    NSString *keychainTestValue = @"keychainTestValue";
    [self createKeychainValue:keychainTestValue forIdentifier:keychainTestKey];
    NSString *loadedValue = [self keychainStringFromMatchingIdentifier:keychainTestKey];
    [self deleteItemFromKeychainWithIdentifier:keychainTestKey];
    return ([keychainTestValue isEqualToString: loadedValue]);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.