ฉันจะปรับใช้แอปพลิเคชั่น iPhone จาก Xcode ไปยังอุปกรณ์ iPhone จริงได้อย่างไร


157

ฉันจะปรับใช้แอปพลิเคชัน iPhone จาก Xcode ไปยังอุปกรณ์ iPhone จริงโดยไม่ต้องมีใบรับรอง Apple $ 99 ได้อย่างไร


ดูคำตอบสำหรับคำถามที่ฉันถามไปก่อนหน้านี้เพื่อหาคำแนะนำที่ดีเกี่ยวกับวิธีการใส่ไว้ใน iPhone ของคุณเจลเบรค
Dan Walker

6
ที่เกี่ยวข้อง: stackoverflow.com/questions/37464/iphone-app-minus-app-store
philfreo

2
Xcode 7 มีการจัดสรรฟรีในขณะนี้ดังนั้นจึงไม่จำเป็นต้องลงทะเบียนสำหรับบัญชีนักพัฒนา Apple เพื่อทดสอบแอปบนอุปกรณ์จริง ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
Suragch

คำตอบ:


56

ดูเหมือนว่าแอปพลิเคชันจะไม่ได้รับการลงชื่อ ดาวน์โหลด ldid จาก Cydia จากนั้นใช้อย่าง:ldid -S /Applications/AccelerometerGraph.app/AccelerometerGraph

ตรวจสอบให้แน่ใจด้วยว่าไบนารีนั้นถูกทำเครื่องหมายว่าสามารถทำงานได้: chmod +x /Applications/AccelerometerGraph.app/AccelerometerGraph


3
ใช่คุณจะต้องแหกคุกอุปกรณ์ของคุณเพื่อให้วิธีนี้ใช้งานได้ (ชัด)
2010

คุณจะเปิดคำสั่ง ldid -S ได้อย่างไร? คุณต้องการคอนโซล SSH หรือไม่ จะมีวิธีฟรีในการรับไคลเอนต์ SSH ใน IPhone jailbroken?
Dan Leahu

tanderson: มีแพ็คเกจ ldid ใน Cydia และคุณสามารถคอมไพล์หนึ่งไฟล์สำหรับ OS X
rpetrich

ฉันเชื่อว่าคำถามของเขาคือวิธีพิมพ์และใช้คำสั่งไม่ใช่วิธีรับแพ็ค @ ทันเดอร์สันคุณสามารถผ่านOpen SSH (แล้วเชื่อมต่อกับโทรศัพท์จากเดสก์ท็อปของคุณ) หรือเทอร์มินัลภายใน iPhone เอง ปพลิเคชันทั้งสองมีการดาวน์โหลดฟรีจากCydia ด้วย SSH คุณจะได้เปรียบคุณสามารถใช้มันเพื่อคัดลอกแอพของคุณไปยังโทรศัพท์ด้วย หากคุณทำสิ่งนี้มากให้แน่ใจว่าได้ตรวจสอบคำตอบอื่น ๆ - คุณสามารถทำให้ XCode ทำงานให้คุณได้ทั้งหมด แต่มันเป็นขั้นตอนที่ลำบากในการหลอกให้ทำเช่นนั้น
cregox

92

ผมเคยใช้การผสมผสานของสอง HOWTOs A: เจสันและอเล็กซ์ ด้วยข้อที่สองเรามีข้อได้เปรียบจากความสามารถในการดีบัก ฉันจะเพียงคัดลอกทั้งสองด้านล่าง (และลดความซับซ้อนของ alex):

อัปเดตมกราคม 2555:ยังใช้งานได้กับ SDK 4.2.1 และ iOS 5.0.1 - ฉันเพิ่งทดสอบทั้งหมดบนคอมพิวเตอร์และอุปกรณ์ใหม่!


1. สร้างใบรับรองที่ลงชื่อด้วยตนเอง

แก้ไข iPhone SDK ของคุณเพื่ออนุญาตการใช้ใบรับรองนี้:

  1. เปิดใช้งาน Keychain Access.app หากไม่มีรายการที่ถูกเลือกจากเมนูพวงกุญแจให้เลือกผู้ช่วยใบรับรองแล้วสร้างใบรับรอง

    • ชื่อ: iPhone Developer
    • ประเภทใบรับรอง: การ เซ็นรหัส
    • ให้ฉันแทนที่ค่าเริ่มต้น: ใช่
  2. คลิกดำเนินการต่อ

    • ความถูกต้อง: 3650 วัน
  3. คลิกดำเนินการต่อ

  4. ว่างเปล่าออกอีเมล์เขตข้อมูลที่อยู่

  5. คลิกต่อไปจนกว่าสมบูรณ์

    คุณควรจะเห็น"ใบรับรองหลักนี้ไม่น่าเชื่อถือ" สิ่งนี้คาดว่า

  6. ตั้งค่า iPhone SDK เพื่ออนุญาตให้ใช้ใบรับรองที่ลงนามเอง:

    sudo /usr/bin/sed -i .bak 's/XCiPhoneOSCodeSignContext/XCCodeSignContext/' /Developer/Platforms/iPhoneOS.platform/Info.plist

    หากคุณเปิด Xcode ให้รีสตาร์ทเพื่อให้การเปลี่ยนแปลงนี้มีผล

และถ้าคุณใช้ iOS 5 นั่นแหละ! ลองเลย! อาจไม่อนุญาตให้ทำการดีบัก แต่แอปจะอยู่ที่นั่น!

ฉันประหลาดใจมากกับสิ่งนี้เพราะอย่างที่คุณควรรู้ฉันไม่รู้เลยว่าการแฮ็คเหล่านั้นเกี่ยวกับอะไร! ทั้งหมดที่ฉันทำคือการปรับปรุงเล็กน้อยสิ่งที่ฉันพบที่อื่นตามที่ฉันชี้

ดังนั้นใช่วิธีการทั้งหมดไม่ทำงานเหมือนเดิมอีกต่อไปและฉันไม่สามารถหาวิธีใหม่ได้ ... ยกเว้นสิ่งนี้ซึ่งใช้เครื่องมือที่ชื่อว่า Theosแต่ฉันไม่สามารถผ่านกระบวนการทั้งหมดได้

สุดท้ายหากคุณต้องการถอนการติดตั้งไม่ว่าด้วยเหตุผลใดก็ตามให้ตรวจสอบตอนท้ายของโพสต์นี้ ในกรณีของฉันฉันต้องเพราะฉันไม่สามารถเข้าใจได้ว่าทำไมสีฟ้าทั้งหมดนี้จึงหยุดทำงานและฉันไม่สามารถดูแลได้อีกต่อไปเพราะเราได้รับใบอนุญาตที่รอมานานแล้ว (หมายเลข DUNS ที่ไม่ต่อเนื่องใช้เวลานานมาก ... )

.

.


.

.

.

2. เปิดใช้งาน Xcode เพื่อสร้างบนอุปกรณ์ Jailbroken

  1. บน iPhone ที่ถูกเจลเบรคแล้วให้ติดตั้งแอพAppSyncโดยเพิ่มแหล่งที่มา ** http://repo.hackyouriphone.org **

  2. นำความต้องการ SDK สำหรับเข้าสู่ระบบรหัสและสิทธิ (ฉันรักsed !):

    sudo /usr/bin/sed -i .bak '/_REQUIRED/N;s/YES/NO/' /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist
  3. ให้ความสนใจกับiPhoneOS5.0.sdkส่วนหนึ่ง ตัวอย่างเช่นหากคุณใช้ iOS 4.2 SDK เพียงแทนที่ด้วย:

    sudo /usr/bin/sed -i .bak '/_REQUIRED/N;s/YES/NO/' /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist
  4. เอาเป็นว่าการกำจัดความต้องการผ่านการปรับปรุง Xcode นี่หมายถึงการแก้ไขแบบไบนารี:

    cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
    dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
    printf "\xc3\x26\x00\x00" >> working
    /bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
    /bin/mv working iPhoneOS\ Build\ System\ Support
    chmod a+x iPhoneOS\ Build\ System\ Support

    หากคุณเปิด Xcode ให้รีสตาร์ทเพื่อให้การเปลี่ยนแปลงนี้ (และครั้งสุดท้าย) มีผล

  5. เปิด"โครงการ> แก้ไขการตั้งค่าโครงการ" (จากเมนู) คลิกที่แท็บ"สร้าง" ค้นหา"รหัสการลงนามรหัส"และรายการย่อย "อุปกรณ์ iPhoneOS ใด ๆ "ในรายการและตั้งค่าทั้งสองเป็นรายการ"ไม่ต้องลงชื่อรหัส" :

    ข้อความแสดงแทน

    หลังจากนี้รู้สึกอิสระที่จะยกเลิกขั้นตอนที่ 3 อย่างน้อยในกรณีของฉันมันก็ไม่เป็นไร

  6. การตั้งค่า Xcode เป็นเครื่องหมายรหัสด้วยใบรับรองที่ลงนามเองของเราเอง(วิธีการแรก) อาจข้ามขั้นตอนนี้ได้หากคุณไม่ต้องการดีบัก:

    mkdir /Developer/iphoneentitlements401
    cd /Developer/iphoneentitlements401
    curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
    mv gen_entitlements.txt gen_entitlements.py
    chmod 777 gen_entitlements.py

    เสียบ iPhone ของคุณและเปิด Xcode เปิดหน้าต่าง> ออแกไนเซอร์ เลือกอุปกรณ์จากรายการทางด้านซ้ายมือแล้วคลิก "ใช้เพื่อการพัฒนา" คุณจะได้รับแจ้งให้ลงชื่อเข้าใช้เว็บไซต์การจัดเตรียมคลิกยกเลิก มันมีไว้เพื่อให้การจัดสรรที่ถูกกฎหมายง่ายขึ้น แต่ไม่ได้ทำให้การจัดสรรที่ผิดกฎหมายไม่ยากขึ้น

    ตอนนี้คุณต้องทำเช่นนี้ส่วนสุดท้ายสำหรับโครงการใหม่ทุกครั้งที่คุณทำ ไปที่เมนูโครงการ> เฟสสร้างใหม่> สร้างเฟสสคริปต์สร้างใหม่ ในหน้าต่างคัดลอก / วางสิ่งนี้:

    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
    /Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
    codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
    fi

.

.


.

.

ถอนการติดตั้ง

สำหรับส่วนที่ 1:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Info.plist.bak /Developer/Platforms/iPhoneOS.platform/Info.plist

สำหรับส่วนที่ 2:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist.bak /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/SDKSettings.plist
sudo mv -f iPhoneOS\ Build\ System\ Support.original iPhoneOS\ Build\ System\ Support

ในกรณีที่คุณทำขั้นตอนที่ 3 แทน 2 เพียงแค่แก้ไขตามนั้นเช่นกัน:

sudo mv -f /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist.bak /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/SDKSettings.plist

สำหรับส่วนที่เหลือเพียงคืนค่าสิ่งที่คุณทำบน XCode และลบ/Developer/iphoneentitlements401/gen_entitlements.pyหากคุณต้องการ:

sudo rm -f /Developer/iphoneentitlements401/gen_entitlements.py

ลองทำตามคำแนะนำเหล่านี้ แต่ตอนนี้ 'Scheme' เป็นประเภท My Mac 64 บิตและฉันไม่มีตัวเลือกใด ๆ ในการรันโปรแกรมจำลองหรือ iPhone จริงอีกต่อไปดังนั้นฉันจึงไม่สามารถทดสอบรหัสได้ ฉันใช้ SDK 4.3 ไม่แน่ใจว่ามีปัญหาหรือไม่
nosatalian

1
ที่จริงแล้วอัพเดท: หลังจากเปลี่ยน SDK พื้นฐานในการตั้งค่าโครงการจาก iphoneos เป็น iOS 4.3 ทุกอย่างทำงานได้ แม้ว่า xcode กล่าวว่า 'ข้อผิดพลาดในการเปิดโปรแกรมระยะไกล: ล้มเหลวในการรับงานสำหรับกระบวนการ' ฉันสามารถเปิดแอปได้โดยคลิกที่มัน
nosatalian

1
ฉันได้รับข้อผิดพลาดนี้: The identity used to sign the executable is no longer valid. ... (0xE8008018) แม้ว่าฉันจะใช้เวลา 3650 วันในการหมดอายุ ดูเหมือนว่าโทรศัพท์กำลังตรวจสอบอยู่
Stephen

เคล็ดลับ "patching XCode" นี้ใช้งานได้กับ 4.3.2 หรือไม่หรือมันจะทำให้เบรคขึ้นมาได้บ้าง
Gabor

1
จุดที่ 6 ในกรณีของฉันฉันต้องเปลี่ยน /Developer/iphoneentitlements401/gen_entitlements.py การอนุญาตของไฟล์เพื่อให้ผู้ใช้ทั่วไปสามารถดำเนินการได้ ด้วยวิธีนี้ขั้นตอนการทำงานอย่างสมบูรณ์แบบ
abidibo

43

ฟรี Provisioning หลังจาก Xcode 7

ในการทดสอบแอปของคุณบนอุปกรณ์จริงแทนที่จะจ่ายค่าธรรมเนียม Apple Developer (หรือแหกคุกอุปกรณ์ของคุณ) คุณสามารถใช้การจัดสรรใหม่ฟรีที่ Xcode 7 และ iOS 9 รองรับ

นี่คือขั้นตอนที่ทำมากหรือน้อยจากเอกสาร (ซึ่งค่อนข้างดีดังนั้นจึงควรอ่าน):

1. เพิ่ม Apple ID ของคุณใน Xcode

ไปที่ XCode> การตั้งค่า> แท็บบัญชี> ปุ่มเพิ่ม (+)> เพิ่ม Apple ID ดูเอกสารสำหรับความช่วยเหลือเพิ่มเติม

ป้อนคำอธิบายรูปภาพที่นี่

2. คลิกแท็บทั่วไปใน Project Navigator

ป้อนคำอธิบายรูปภาพที่นี่

3. เลือก Apple ID ของคุณจากเมนูป๊อปอัพทีม

ป้อนคำอธิบายรูปภาพที่นี่

4. เชื่อมต่ออุปกรณ์ของคุณและเลือกในเมนูแบบแผน

ป้อนคำอธิบายรูปภาพที่นี่

5. คลิกปุ่มแก้ไขปัญหา

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณได้รับข้อผิดพลาดเกี่ยวกับชื่อกลุ่มที่ไม่ถูกต้องให้เปลี่ยนเป็นชื่อที่ไม่ซ้ำ

6. เปิดแอปของคุณ

ใน Xcode คลิกปุ่มสร้างและเรียกใช้

ป้อนคำอธิบายรูปภาพที่นี่

7. เชื่อถือนักพัฒนาแอปในการตั้งค่าอุปกรณ์

หลังจากเรียกใช้แอพของคุณคุณจะได้รับข้อผิดพลาดด้านความปลอดภัยเนื่องจากแอพที่คุณต้องการเรียกใช้นั้นไม่ได้มาจาก App Store

ป้อนคำอธิบายรูปภาพที่นี่

บนอุปกรณ์ของคุณไปที่การตั้งค่า> ทั่วไป> โปรไฟล์> ชื่อApple-ID ของคุณ > Trust -Apple-ID-name > Trust

8. เปิดแอปของคุณบนอุปกรณ์อีกครั้ง

แค่นั้นแหละ. ตอนนี้คุณสามารถเรียกใช้ของคุณเอง (หรือแอพอื่น ๆ ที่คุณมีซอร์สโค้ดได้) โดยไม่ต้องเสียเงิน $ 99 ขอบคุณ Apple สำหรับการอนุญาตในที่สุด


1
ขอบคุณมาก. สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบหากไม่มีใบอนุญาตผู้พัฒนาของ Apple
kishorer747

แม้ว่าจะมีปัญหาบางอย่าง - คุณสามารถติดตั้งได้สูงสุด 3 แอพต่อครั้งและคุณต้องต่ออายุใบรับรองทุกสัปดาห์
SilverWolf - Reinstate Monica

@eaturtle ขอบคุณสำหรับการอัพเดท ในที่สุดฉันก็แยกเงินสำหรับใบอนุญาตนักพัฒนาซอฟต์แวร์ดังนั้นฉันจึงไม่ได้คอยติดตามคำตอบนี้ แย่มากเกี่ยวกับข้อ จำกัด มีบางสิ่งเกี่ยวกับ Android ที่ดีกว่า Apple
Suragch

9

คุณทำไม่ได้ใช่ไหมถ้าคุณกำลังพูดถึงแอพพลิเคชั่นที่สร้างด้วย SDK อย่างเป็นทางการและปรับใช้โดยตรงจาก xcode


8

คุณจะต้องแหกคุกอุปกรณ์ของคุณ


1
ทำตามวิธีของ @ rpetrich และ SSH ที่สามารถเรียกใช้งานได้ในโฟลเดอร์ / แอปพลิเคชันของอุปกรณ์มันควรจะทำงานหลังจากรีบูต / respring
เลี่ยง

6

มีวิธีการปรับใช้แอพ iPhone โดยไม่ต้องจ่ายให้แอปเปิลคุณจะต้องแหกคุกอุปกรณ์ของคุณและทำตามคำแนะนำในhttp://www.alexwhittemore.com/?p=398


ยังเป็นไกด์ที่สมบูรณ์แบบด้วยแนวทางที่แตกต่างจาก @Dan ... ฉันใช้ทั้งคู่
cregox

5

ไม่มีสิ่งใดที่ฉันเคยเห็นทุกที่บ่งบอกว่าคุณสามารถปรับใช้กับ iPhone จริงโดยไม่ต้องมีใบรับรอง (จ่ายเงิน)


4

เมื่อคืนนี้ฉันได้พบกับ Developer Developer ของ Apple และในหนังสือรับรองการจัดสรรฉันพบบางสิ่งเช่น - "สมาชิกในทีมที่เซ็นชื่อ" ฉันคิดว่ามีวิธีเพิ่มสมาชิกในทีมไปยังโปรไฟล์ที่ต้องชำระ คุณสามารถขอให้เจ้าของรหัสแอป (เสียค่าใช้จ่าย) เพื่อเพิ่มคุณเป็นสมาชิกทีม ฉันไม่แน่ใจ. ยังค้นหาอยู่


ใช่คุณสามารถเพิ่มสมาชิกในทีม มีขีด จำกัด 200 อุปกรณ์ต่อปี
cregox

Cawas - คุณรู้วิธีเพิ่มสมาชิกใน apple id ของคุณหรือไม่?
Akshay

เราจะได้รับการแจ้งเตือนเฉพาะเมื่อคุณเพิ่ม @ ข้างหน้าชื่อ ดังที่คุณพูดถึงตัวคุณเองคุณจะต้องได้รับบัญชีการชำระเงินก่อน แล้วมันควรจะง่ายจริงๆเพราะฉันไม่พบบทช่วยสอนเกี่ยวกับวิธีการทำ ฉันไม่เคยทำเอง
cregox

3

ไม่ง่ายในการทำเช่นนี้ ใน Xcode ให้ตั้งค่า Active Configuration เป็น Release เปลี่ยนอุปกรณ์จาก Simulator เป็น Device - SDK ใด ๆ หากคุณต้องการส่งออกไปยัง iPhone โดยตรงให้เชื่อมต่อกับคอมพิวเตอร์ของคุณ กด Build and Go หาก iPhone ของคุณไม่ได้เชื่อมต่อกับคอมพิวเตอร์จะมีข้อความแจ้งว่า iPhone ของคุณไม่ได้เชื่อมต่อ

หากสิ่งนี้ใช้ได้กับคุณ: (iPhone ไม่ได้เชื่อมต่อ)

ไปที่โฟลเดอร์โครงการของคุณแล้วไปที่โฟลเดอร์สร้างภายใน ไปที่โฟลเดอร์ Release-iphoneos และนำแอพเข้าไปข้างในลากและวางบนไอคอน iTunes เมื่อคุณซิงค์อุปกรณ์ iTouch ของคุณมันจะคัดลอกไปยังอุปกรณ์ของคุณ มันจะปรากฏขึ้นใน iTunes เป็นแอพพลิเคชั่นสำหรับ iPhone

หวังว่านี่จะช่วยได้!

PS: ถ้ามีข้อความว่าใบรับรองไม่ถูกต้องให้คลิกที่โครงการใน Xcode ไอคอนโครงการเล็ก ๆ ในกองไฟล์ทางซ้ายและกด Apple + I หรือรับข้อมูลจากแถบเมนู คลิกที่สร้างที่ด้านบน ภายใต้การเซ็นชื่อรหัสให้เปลี่ยนรหัสการลงชื่อรหัส - อุปกรณ์ iPhone OS ใด ๆ ที่จะไม่ลงชื่อ


7
OP ไม่มีใบรับรองการลงนามหรือโปรไฟล์การจัดสรร คำแนะนำเหล่านี้สำหรับสมาชิกหากโปรแกรมนักพัฒนา iPhone $ 99 แต่ไม่ได้ตอบคำถามเกี่ยวกับวิธีการใช้งานบนอุปกรณ์โดยไม่ต้องสมัครใช้งานโปรแกรม
cdespinosa

2

ทั้งหมดนี้ขึ้นอยู่กับเวอร์ชันของ Xcode ที่คุณใช้เป็นเวอร์ชันที่ต่างกันใช้วิธีการต่าง ๆ ในการปรับใช้กับ iPhone ของคุณโดยไม่ต้องมีโปรไฟล์การจัดสรร

Xcode 3.2.1 เป็นรุ่นที่ดีและง่ายต่อการสังคายนา แต่เราจำเป็นต้องรู้ว่าคุณใช้เวอร์ชั่นใด


2

โซลูชันที่โพสต์โดย Cawas ทำงานได้อย่างสมบูรณ์แบบกับ XCode4 เช่นกัน อย่างไรก็ตามมีการเปลี่ยนแปลงบางอย่างกับ UI ของ IDE ดังนั้นคุณต้องทำการวิจัยเพื่อค้นหา Run Script :)

ในมุมมอง Project Navigator คลิกรายการรูทของโครงการจากนั้นในหน้าต่างกลางเลือก Target จากนั้นคลิกแท็บ Build Phases และที่ด้านล่างคุณจะเห็นปุ่มเพิ่ม Build Phase คลิกและเลือก Add Run Script แล้ววาง "codesign "สคริปต์โพสต์โดย Cawas


1

ไม่มีวิธีแก้ไขเฉพาะหน้า คุณสามารถปรับใช้แอพได้เฉพาะเมื่อมีการลงทะเบียนกับอุปกรณ์ของคุณ สิ่งนี้ป้องกันคุณจากการสร้างแอพสโตร์ของคุณเอง ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.