SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
Sparkle          in


                   	 	     	 	         	 	    	 	 




2009   12   19
2009   12   19
‣

                 ‣

                     ‣   Appcasting

                 ‣   MIT

                          http://sparkle.andymatuschak.org/


                                          3
2009   12   19
‣

                 ‣

                     ‣   Appcasting

                 ‣   MIT

                          http://sparkle.andymatuschak.org/


                                          3
2009   12   19
‣   RSS 2.0

                     ✦   Podcasting

                     ✦   enclosure
                         http://connectedflow.com/appcasting/



                                          4
2009   12   19
<?xml version="1.0" encoding="utf-8"?>
   <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
      <title>MyNiceApp Appcast</title>
      <link>http://example.com/appcast.xml</link>
      <description>MyNiceApp Releases</description>
      <language>en</language>
      <item>
        <title>MyNiceApp Version 1.5.5</title>
        <description>http://example.com/release155.html</description>
        <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate>
        <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg"
          length="371494"
          type="application/octet-stream"/>
      </item>
    </channel>
   </rss>

                                    5
2009   12   19
1Passwd            CSSEdit             iAlertU                Max                  Podcast Maker    SubCleaner
             1Passwd            Cyberduck           iAmazon                MainMenu             Posterino        SubEthaEdit
             Airport Monitor    D&D Manager         iKey                   MacFungus            Pukka            Suitcase Fusion
             Utility            Desk Lamp           InCrease               MarsEdit             Punakea          Tables
             Adium              Desktop Lyrics      InsomniaX              MDict                Pyro             Task List
             Alarm Clock        Diamond             iPalette               MemoryMiner          QuickEffect      TrailRunner
             Album Art Thingy   Diffly               iProcrastinate         MiniBatteryLogger    Quinn            Trampoline
             AppZapper          DiskLibrary         iRetrospect            Monolingual          RatRace          Tranceiver
             Auction Hunter     dotMac Menu         iShowU                 Morph Age            RAX              Transmission
             Aurora             Downsize            iSleep                 MultiAlarm           RDCMenu          TrapperKeeper
             Avenir             DrawIt              iStumbler              Multisite for iWeb   Relaunch         TubeSock
             Backuplist+        DVD Remaster        iSyncIt                Notae                rooSwitch        TuneConnect
             BetterZip          Event Maker         iTerm                  On The Job           rooVid           TypeTrainer4Mac
             BeerAlchemy        Family              iTunes Album           Opal                 SaverLab         UnicodeChecker
             Birthdaybook       Feeder              Playlist Creator       Overflow              Schoolhouse      UnRarX
             BombSquad          Find It! Keep It!   iVerbum                Paintbrush           Scrivener        Valet
             Books              FlexTime            iTunes Remote          Parsley is           Secure Remote    vCardExplorer
             Bullfrog           Flickr Finder       Control                Atomically           Disk             Vienna
             Cast Life          ForgEdit            Jumpcut                Delicious            SenChecker       VibeKit
             CDRevolution       Gcal.app            Keep It Together       Path Finder          Senor Staff      Virtual Dashboard
             Checkout           Ghost Action        Kandalu X              PDFClerk             Shimo            Virtue
             ChocoFlop          Google Buddy        License Keeper         PDFKey Pro           SimplyBurns      Voice Candy
             Cocoalicious       GuidaTV             Linkinus               PDFView              SiteCapture      Wcode
             Code Collector     guitone             LoadMyTracks           Peek-a-Boo           SNCF Schedules   Xacktunes
             Colloquy           hawkeye             LogitechLCDTool        Peel                 Snapshot         Xcast
             Compare Folders    Hazel               LogTen Pro             Pixen                SolarSeek        Xslimmer
             Corripio           HostManager         Luscious SMS           Planbook             Soulver
             Crittersim                             Magrathea              Play                 Springy




                                                                       6
2009   12   19
1Passwd            CSSEdit             iAlertU                Max                  Podcast Maker    SubCleaner
             1Passwd            Cyberduck           iAmazon                MainMenu             Posterino        SubEthaEdit
             Airport Monitor    D&D Manager         iKey                   MacFungus            Pukka            Suitcase Fusion
             Utility            Desk Lamp           InCrease               MarsEdit             Punakea          Tables
             Adium              Desktop Lyrics      InsomniaX              MDict                Pyro             Task List
             Alarm Clock        Diamond             iPalette               MemoryMiner          QuickEffect      TrailRunner
             Album Art Thingy   Diffly               iProcrastinate         MiniBatteryLogger    Quinn            Trampoline
             AppZapper          DiskLibrary         iRetrospect            Monolingual          RatRace          Tranceiver
             Auction Hunter     dotMac Menu         iShowU                 Morph Age            RAX              Transmission
             Aurora             Downsize            iSleep                 MultiAlarm           RDCMenu          TrapperKeeper
             Avenir             DrawIt              iStumbler              Multisite for iWeb   Relaunch         TubeSock
             Backuplist+        DVD Remaster        iSyncIt                Notae                rooSwitch        TuneConnect



                                                    158 apps
             BetterZip          Event Maker         iTerm                  On The Job           rooVid           TypeTrainer4Mac
             BeerAlchemy        Family              iTunes Album           Opal                 SaverLab         UnicodeChecker
             Birthdaybook       Feeder              Playlist Creator       Overflow              Schoolhouse      UnRarX
             BombSquad          Find It! Keep It!   iVerbum                Paintbrush           Scrivener        Valet
             Books
             Bullfrog
                                FlexTime
                                Flickr Finder       Control(May. 2007)
                                                    iTunes Remote          Parsley is
                                                                           Atomically
                                                                                                Secure Remote
                                                                                                Disk
                                                                                                                 vCardExplorer
                                                                                                                 Vienna
             Cast Life          ForgEdit            Jumpcut                Delicious            SenChecker       VibeKit
             CDRevolution       Gcal.app            Keep It Together       Path Finder          Senor Staff      Virtual Dashboard
             Checkout           Ghost Action        Kandalu X              PDFClerk             Shimo            Virtue
             ChocoFlop          Google Buddy        License Keeper         PDFKey Pro           SimplyBurns      Voice Candy
             Cocoalicious       GuidaTV             Linkinus               PDFView              SiteCapture      Wcode
             Code Collector     guitone             LoadMyTracks           Peek-a-Boo           SNCF Schedules   Xacktunes
             Colloquy           hawkeye             LogitechLCDTool        Peel                 Snapshot         Xcast
             Compare Folders    Hazel               LogTen Pro             Pixen                SolarSeek        Xslimmer
             Corripio           HostManager         Luscious SMS           Planbook             Soulver
             Crittersim                             Magrathea              Play                 Springy




                                                                       6
2009   12   19
2009   12   19
‣

                 ‣

                     ✦


                     ✦


                 ‣
                                                  localized with
                                                  Cyberduck
                     ✦   .lproj   →26 (ver 1.1)


                                              8
2009   12   19
2009   12   19
1.   URL        Appcasting

                 2.

                 3.

                 4.                           −

                 5.


                            10
2009   12   19
✦

                 ✦

                 ✦

                     Info.plist



                                  11
2009   12   19
2009   12   19
2009   12   19
‣

                 ‣

                 ‣   Appcast




                               14
2009   12   19
CFBundleVersion



                 MyApp_x.y.z.dmg
                     zip, tar, tbz, tgz, dmg




                               15
2009   12   19
‣

                       .app

                 ‣   .pkg .dpkg

                 ‣                     .app




                                  16
2009   12   19
<?xml version="1.0" encoding="utf-8"?>
   <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
      <title>MyNiceApp Appcast</title>
      <link>http://example.com/appcast.xml</link>
      <description>MyNiceApp Releases</description>
      <language>en</language>
      <item>
        <title>MyNiceApp Version 1.5.5</title>
        <description>http://example.com/release155.html</description>
        <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate>
        <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg"
          length="371494"
          type="application/octet-stream"/>
      </item>
    </channel>
   </rss>

                                    17
2009   12   19
<?xml version="1.0" encoding="utf-8"?>
   <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
      <title>MyNiceApp Appcast</title>       Sparkle
      <link>http://example.com/appcast.xml</link>
      <description>MyNiceApp Releases</description>
      <language>en</language>
      <item>
        <title>MyNiceApp Version 1.5.5</title>
        <description>http://example.com/release155.html</description>
        <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate>
        <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg"
          length="371494"
          type="application/octet-stream"/>
      </item>
    </channel>
   </rss>

                                    17
2009   12   19
<?xml version="1.0" encoding="utf-8"?>
   <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
      <title>MyNiceApp Appcast</title>       Sparkle
      <link>http://example.com/appcast.xml</link>
      <description>MyNiceApp Releases</description>
      <language>en</language>
      <item>
        <title>MyNiceApp Version 1.5.5</title>
        <description>http://example.com/release155.html</description>
        <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate>
        <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg"
          length="371494"
          type="application/octet-stream"/>
      </item>
    </channel>
   </rss>
                                                   URL
                                    17
2009   12   19
2009   12   19
A.appcast

                 B.

                  i. Sparkle

                  ii. Nib

                  iii.Info.plist


                                   19
2009   12   19
20
2009   12   19
SUUpdater




                             21
2009   12   19
SUUpdater
                 checkForUpdate:




                           22
2009   12   19
SUFeedURL (     )          (            )appcast   URL


            SUCheckAtStartup           (            )


            SUScheduledCheckInterval   (        )


            SUShowReleaseNote          (            )



                                   UserDafaults


                                           23
2009   12   19
2009   12   19
‣   sparkle:releaseNotesLink
                     ‣         URL




                                     25
2009   12   19
‣   sparkle:md5sum               enclosure


            <enclosure sparkle:md5Sum=”8659fdec0f64edf04ec4fd8756b819eb"
                       url="http://example.org/MyNiceApp_Orange.zip"
                       length="12345" type="application/octet-stream"/>




                                          26
2009   12   19
‣   Info.plist

                     ‣   SUPublicDSAKey →

                     ‣   SUExpectsDSASignature → YES
                 ‣                          enclosure
                     sparkle:dsaSignature


                                      27
2009   12   19
‣   sparkle:version

                 ‣

            <enclosure sparkle:version="1.5.5"
                       url="http://example.org/MyNiceApp_Orange.zip"
                       length="12345" type="application/octet-stream"/>




                                          28
2009   12   19
‣

                 ‣          .lproj/InfoPlist.strings
                     SUFeedURLKey
                                 URL




                                    29
2009   12   19
‣




                 ‣   DSA



                           30
2009   12   19
2009   12   19
1.   URL        Appcasting

                 2.

                 3.

                 4.                           −

                 5.


                            32
2009   12   19
1.   URL        Appcasting

                 2.

                 3.

                 4.                           −

                 5.


                            32
2009   12   19
SUUtilities.[hm]        3

                 SUStandardVersionComparison()
                 -2

                 SUSplitVersionString()
                 -

                 SUGetCharType()
                 -           /      /



                                        33
2009   12   19
“1.23.4a”→{1,”.”,23,”.”,4,”a”}

                 •
                 •



                                   34
2009   12   19
int SUGetCharType(NSString *character)
        {
            if ([character isEqualToString:@"."]) {
                return kPeriodType;
            } else if ([character isEqualToString:@"0"]
                       || [character intValue] != 0) {
                return kNumberType;
            } else {
                return kStringType;
            }
        }



                               35
2009   12   19
int SUGetCharType(NSString *character)
        {
            if ([character isEqualToString:@"."]) {
                return kPeriodType;
            } else if ([character isEqualToString:@"0"]
                       || [character intValue] != 0) {
                return kNumberType;
            } else {
                return kStringType;
            }
        }



                               35
2009   12   19
“1.23.4a”→ {1,23,4,”a”}
                     “1.23.5.2”→{1,23,5, 2}
                 •

                 •      >

                 •




                                  36
2009   12   19
“1.23.4a”→ {1,23,4,”a”}
                     “1.23.5.2”→{1,23,5, 2}
                 •

                 •      >

                 •




                                  36
2009   12   19
“1.23.4a”→ {1,23,4,”a”}
                     “1.23.5.2”→{1,23,5, 2}
                 •

                 •      >

                 •




                                  36
2009   12   19
“1.23.4a”→ {1,23,4,”a”}
                     “1.23.5.2”→{1,23,5, 2}
                 •                     ↑

                 •      >

                 •




                                  36
2009   12   19
“1.23.4a”→ {1,23,4,”a”}
                     “1.23.5.2”→{1,23,5, 2}
                 •                     ↑

                 •      >

                 •




                                  36
2009   12   19
1.
                 2.
                 3.                  .app

                 4. 3.
                 5.      bash




                                37
2009   12   19
1.
                 2.
                 3.                  .app

                 4. 3.
                 5.      bash




                                37
2009   12   19
1.
                 2.
                 3.                  .app

                 4. 3.
                 5.      bash




                                37
2009   12   19
•   NSTemporaryDirectory() +
                     [NSProcessInfo globallyUniqueString]


                 •            ”.txt”


                     - (void)[SUUpdater beginDownload]
                 - (IBAction)[SUUpdater installAndRestart:]
                                        38
2009   12   19
•   .tar → tar -xC
                 •   .tgz → tar -zXC        •   .zip → ditto -x -k
                 •   .tbz → tar -jxC        •   .dmg → hdiutil ...


                     -(void)[SUUnarchiver extractUpdate]



                                       39
2009   12   19
•   .tar → tar -xC
                 •   .tgz → tar -zXC        •   .zip → ditto -x -k
                 •   .tbz → tar -jxC        •   .dmg → hdiutil ...


                     -(void)[SUUnarchiver extractUpdate]



                                       39
2009   12   19
•   -[NSFileManager enumeratorAtPath:]


                 •   Applications



                 - (IBAction)[SUUpdater installAndRestart:]


                                       40
2009   12   19
•   -[NSFileManager
                          movePathWithAuthentication:toPath:]
                 •




                 - (IBAction)[SUUpdater installAndRestart:]


                                       41
2009   12   19
setenv("LAUNCH_PATH", [currentAppPath UTF8String], 1);
                  setenv("TEMP_FOLDER", [[downloadPath stringByDeletingLastPathComponent] UTF8String], 1);
                  system("/bin/bash -c '{ for (( i = 0; i < 3000 && “
                         ”$(echo $(/bin/ps -xp $PPID|/usr/bin/wc -l))-1; i++ )); don"
                         "    /bin/sleep .2;n"
                         " donen"
                         " if [[ $(/bin/ps -xp $PPID|/usr/bin/wc -l) -ne 2 ]]; thenn"
                         "    /usr/bin/open "${LAUNCH_PATH}"n"
                         " fin"
                         " rm -rf "${TEMP_FOLDER}"n"
                         "} &>/dev/null &'");
                  [NSApp terminate:self];




                 - (IBAction)[SUUpdater installAndRestart:]
                                                            42
2009   12   19
setenv("LAUNCH_PATH", [currentAppPath UTF8String], 1);
                  setenv("TEMP_FOLDER", [[downloadPath stringByDeletingLastPathComponent] UTF8String], 1);
                  system("/bin/bash -c '{ for (( i = 0; i < 3000 && “
                         ”$(echo $(/bin/ps -xp $PPID|/usr/bin/wc -l))-1; i++ )); don"
                         "    /bin/sleep .2;n"
                         " donen"
                         " if [[ $(/bin/ps -xp $PPID|/usr/bin/wc -l) -ne 2 ]]; thenn"
                         "    /usr/bin/open "${LAUNCH_PATH}"n"
                         " fin"
                         " rm -rf "${TEMP_FOLDER}"n"
                         "} &>/dev/null &'");
                  [NSApp terminate:self];


                               bash
                                                                              open


                 - (IBAction)[SUUpdater installAndRestart:]
                                                            42
2009   12   19
‣   Sparkle   Appcasting


                 ‣

                     ‣

                 ‣



                                      43
2009   12   19
2009   12   19
2009   12   19
‣

                 ‣




                     46
2009   12   19
‣                     dmg




                 ‣

                     jp.i.nifty.kimuraw.SparkleSample.plist



                                       47
2009   12   19

Mais conteúdo relacionado

Destaque

InputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうInputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうWataru Kimura
 
Xcode4 project template (slide)
Xcode4 project template (slide)Xcode4 project template (slide)
Xcode4 project template (slide)Wataru Kimura
 
ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析Wataru Kimura
 
Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Wataru Kimura
 
OS X DYLD_* environments
OS X DYLD_* environmentsOS X DYLD_* environments
OS X DYLD_* environmentsWataru Kimura
 

Destaque (7)

InputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろうInputMethodKitで入力プログラムをつくろう
InputMethodKitで入力プログラムをつくろう
 
Xcode4 project template (slide)
Xcode4 project template (slide)Xcode4 project template (slide)
Xcode4 project template (slide)
 
ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析ClangでObjective-Cを静的解析
ClangでObjective-Cを静的解析
 
Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化Precipitateに見る、外部リソースのSpotlight化
Precipitateに見る、外部リソースのSpotlight化
 
値変換
値変換値変換
値変換
 
OS X DYLD_* environments
OS X DYLD_* environmentsOS X DYLD_* environments
OS X DYLD_* environments
 
Clang Modules
Clang ModulesClang Modules
Clang Modules
 

Semelhante a Sparkle Appcasting Guide

Development: What they don't teach you in college
Development: What they don't teach you in collegeDevelopment: What they don't teach you in college
Development: What they don't teach you in collegeBinny V A
 
Drupal Showcase: High Tech
Drupal Showcase: High TechDrupal Showcase: High Tech
Drupal Showcase: High TechAcquia
 
Development: What They Don't Teach You in College
Development: What They Don't Teach You in CollegeDevelopment: What They Don't Teach You in College
Development: What They Don't Teach You in CollegeBinny V A
 
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...Claus Ibsen
 
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integration
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integrationSouJava May 2020: Apache Camel 3 - the next generation of enterprise integration
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integrationClaus Ibsen
 
Embracing concurrency for fun utility and simpler code
Embracing concurrency for fun utility and simpler codeEmbracing concurrency for fun utility and simpler code
Embracing concurrency for fun utility and simpler codekamaelian
 
The Evolution of Internet-Scale Event Notification Services
The Evolution of Internet-Scale Event Notification ServicesThe Evolution of Internet-Scale Event Notification Services
The Evolution of Internet-Scale Event Notification ServicesHiroshi Ono
 
Falsy Values - Warsaw 2011
Falsy Values - Warsaw 2011Falsy Values - Warsaw 2011
Falsy Values - Warsaw 2011Brian LeRoux
 
All out in the Cloud - CloudEast 2012
All out in the Cloud - CloudEast 2012All out in the Cloud - CloudEast 2012
All out in the Cloud - CloudEast 2012Jan Jongboom
 
Browser as a broadcast medium
Browser as a broadcast mediumBrowser as a broadcast medium
Browser as a broadcast mediumvrt-medialab
 
State of Developer Tools (WDS09)
State of Developer Tools (WDS09)State of Developer Tools (WDS09)
State of Developer Tools (WDS09)bgalbs
 
Kamaelia lightning2010opensource
Kamaelia lightning2010opensourceKamaelia lightning2010opensource
Kamaelia lightning2010opensourcekamaelian
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking systemJesse Vincent
 
Brand Science
Brand ScienceBrand Science
Brand ScienceiStrategy
 
2011 JavaScript Developer Generation
2011 JavaScript Developer Generation2011 JavaScript Developer Generation
2011 JavaScript Developer GenerationRhio Kim
 

Semelhante a Sparkle Appcasting Guide (20)

Apps pl ayer
Apps pl ayerApps pl ayer
Apps pl ayer
 
iPad App Evaluation Guide
iPad App Evaluation GuideiPad App Evaluation Guide
iPad App Evaluation Guide
 
Fileyogi
FileyogiFileyogi
Fileyogi
 
Development: What they don't teach you in college
Development: What they don't teach you in collegeDevelopment: What they don't teach you in college
Development: What they don't teach you in college
 
Drupal Showcase: High Tech
Drupal Showcase: High TechDrupal Showcase: High Tech
Drupal Showcase: High Tech
 
Development: What They Don't Teach You in College
Development: What They Don't Teach You in CollegeDevelopment: What They Don't Teach You in College
Development: What They Don't Teach You in College
 
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...
Red Hat Nordics 2020 - Apache Camel 3 the next generation of enterprise integ...
 
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integration
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integrationSouJava May 2020: Apache Camel 3 - the next generation of enterprise integration
SouJava May 2020: Apache Camel 3 - the next generation of enterprise integration
 
Embracing concurrency for fun utility and simpler code
Embracing concurrency for fun utility and simpler codeEmbracing concurrency for fun utility and simpler code
Embracing concurrency for fun utility and simpler code
 
The Evolution of Internet-Scale Event Notification Services
The Evolution of Internet-Scale Event Notification ServicesThe Evolution of Internet-Scale Event Notification Services
The Evolution of Internet-Scale Event Notification Services
 
Falsy Values - Warsaw 2011
Falsy Values - Warsaw 2011Falsy Values - Warsaw 2011
Falsy Values - Warsaw 2011
 
All out in the Cloud - CloudEast 2012
All out in the Cloud - CloudEast 2012All out in the Cloud - CloudEast 2012
All out in the Cloud - CloudEast 2012
 
Browser as a broadcast medium
Browser as a broadcast mediumBrowser as a broadcast medium
Browser as a broadcast medium
 
State of Developer Tools (WDS09)
State of Developer Tools (WDS09)State of Developer Tools (WDS09)
State of Developer Tools (WDS09)
 
Kamaelia lightning2010opensource
Kamaelia lightning2010opensourceKamaelia lightning2010opensource
Kamaelia lightning2010opensource
 
Sdp summit
Sdp summitSdp summit
Sdp summit
 
SD, a P2P bug tracking system
SD, a P2P bug tracking systemSD, a P2P bug tracking system
SD, a P2P bug tracking system
 
Brand Science
Brand ScienceBrand Science
Brand Science
 
2011 JavaScript Developer Generation
2011 JavaScript Developer Generation2011 JavaScript Developer Generation
2011 JavaScript Developer Generation
 
History Boxes
History BoxesHistory Boxes
History Boxes
 

Sparkle Appcasting Guide

  • 1. Sparkle in 2009 12 19
  • 2. 2009 12 19
  • 3. ‣ ‣ Appcasting ‣ MIT http://sparkle.andymatuschak.org/ 3 2009 12 19
  • 4. ‣ ‣ Appcasting ‣ MIT http://sparkle.andymatuschak.org/ 3 2009 12 19
  • 5. RSS 2.0 ✦ Podcasting ✦ enclosure http://connectedflow.com/appcasting/ 4 2009 12 19
  • 6. <?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"> <channel> <title>MyNiceApp Appcast</title> <link>http://example.com/appcast.xml</link> <description>MyNiceApp Releases</description> <language>en</language> <item> <title>MyNiceApp Version 1.5.5</title> <description>http://example.com/release155.html</description> <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate> <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg" length="371494" type="application/octet-stream"/> </item> </channel> </rss> 5 2009 12 19
  • 7. 1Passwd CSSEdit iAlertU Max Podcast Maker SubCleaner 1Passwd Cyberduck iAmazon MainMenu Posterino SubEthaEdit Airport Monitor D&D Manager iKey MacFungus Pukka Suitcase Fusion Utility Desk Lamp InCrease MarsEdit Punakea Tables Adium Desktop Lyrics InsomniaX MDict Pyro Task List Alarm Clock Diamond iPalette MemoryMiner QuickEffect TrailRunner Album Art Thingy Diffly iProcrastinate MiniBatteryLogger Quinn Trampoline AppZapper DiskLibrary iRetrospect Monolingual RatRace Tranceiver Auction Hunter dotMac Menu iShowU Morph Age RAX Transmission Aurora Downsize iSleep MultiAlarm RDCMenu TrapperKeeper Avenir DrawIt iStumbler Multisite for iWeb Relaunch TubeSock Backuplist+ DVD Remaster iSyncIt Notae rooSwitch TuneConnect BetterZip Event Maker iTerm On The Job rooVid TypeTrainer4Mac BeerAlchemy Family iTunes Album Opal SaverLab UnicodeChecker Birthdaybook Feeder Playlist Creator Overflow Schoolhouse UnRarX BombSquad Find It! Keep It! iVerbum Paintbrush Scrivener Valet Books FlexTime iTunes Remote Parsley is Secure Remote vCardExplorer Bullfrog Flickr Finder Control Atomically Disk Vienna Cast Life ForgEdit Jumpcut Delicious SenChecker VibeKit CDRevolution Gcal.app Keep It Together Path Finder Senor Staff Virtual Dashboard Checkout Ghost Action Kandalu X PDFClerk Shimo Virtue ChocoFlop Google Buddy License Keeper PDFKey Pro SimplyBurns Voice Candy Cocoalicious GuidaTV Linkinus PDFView SiteCapture Wcode Code Collector guitone LoadMyTracks Peek-a-Boo SNCF Schedules Xacktunes Colloquy hawkeye LogitechLCDTool Peel Snapshot Xcast Compare Folders Hazel LogTen Pro Pixen SolarSeek Xslimmer Corripio HostManager Luscious SMS Planbook Soulver Crittersim Magrathea Play Springy 6 2009 12 19
  • 8. 1Passwd CSSEdit iAlertU Max Podcast Maker SubCleaner 1Passwd Cyberduck iAmazon MainMenu Posterino SubEthaEdit Airport Monitor D&D Manager iKey MacFungus Pukka Suitcase Fusion Utility Desk Lamp InCrease MarsEdit Punakea Tables Adium Desktop Lyrics InsomniaX MDict Pyro Task List Alarm Clock Diamond iPalette MemoryMiner QuickEffect TrailRunner Album Art Thingy Diffly iProcrastinate MiniBatteryLogger Quinn Trampoline AppZapper DiskLibrary iRetrospect Monolingual RatRace Tranceiver Auction Hunter dotMac Menu iShowU Morph Age RAX Transmission Aurora Downsize iSleep MultiAlarm RDCMenu TrapperKeeper Avenir DrawIt iStumbler Multisite for iWeb Relaunch TubeSock Backuplist+ DVD Remaster iSyncIt Notae rooSwitch TuneConnect 158 apps BetterZip Event Maker iTerm On The Job rooVid TypeTrainer4Mac BeerAlchemy Family iTunes Album Opal SaverLab UnicodeChecker Birthdaybook Feeder Playlist Creator Overflow Schoolhouse UnRarX BombSquad Find It! Keep It! iVerbum Paintbrush Scrivener Valet Books Bullfrog FlexTime Flickr Finder Control(May. 2007) iTunes Remote Parsley is Atomically Secure Remote Disk vCardExplorer Vienna Cast Life ForgEdit Jumpcut Delicious SenChecker VibeKit CDRevolution Gcal.app Keep It Together Path Finder Senor Staff Virtual Dashboard Checkout Ghost Action Kandalu X PDFClerk Shimo Virtue ChocoFlop Google Buddy License Keeper PDFKey Pro SimplyBurns Voice Candy Cocoalicious GuidaTV Linkinus PDFView SiteCapture Wcode Code Collector guitone LoadMyTracks Peek-a-Boo SNCF Schedules Xacktunes Colloquy hawkeye LogitechLCDTool Peel Snapshot Xcast Compare Folders Hazel LogTen Pro Pixen SolarSeek Xslimmer Corripio HostManager Luscious SMS Planbook Soulver Crittersim Magrathea Play Springy 6 2009 12 19
  • 9. 2009 12 19
  • 10. ‣ ✦ ✦ ‣ localized with Cyberduck ✦ .lproj →26 (ver 1.1) 8 2009 12 19
  • 11. 2009 12 19
  • 12. 1. URL Appcasting 2. 3. 4. − 5. 10 2009 12 19
  • 13. ✦ ✦ Info.plist 11 2009 12 19
  • 14. 2009 12 19
  • 15. 2009 12 19
  • 16. ‣ ‣ Appcast 14 2009 12 19
  • 17. CFBundleVersion MyApp_x.y.z.dmg zip, tar, tbz, tgz, dmg 15 2009 12 19
  • 18. .app ‣ .pkg .dpkg ‣ .app 16 2009 12 19
  • 19. <?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"> <channel> <title>MyNiceApp Appcast</title> <link>http://example.com/appcast.xml</link> <description>MyNiceApp Releases</description> <language>en</language> <item> <title>MyNiceApp Version 1.5.5</title> <description>http://example.com/release155.html</description> <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate> <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg" length="371494" type="application/octet-stream"/> </item> </channel> </rss> 17 2009 12 19
  • 20. <?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"> <channel> <title>MyNiceApp Appcast</title> Sparkle <link>http://example.com/appcast.xml</link> <description>MyNiceApp Releases</description> <language>en</language> <item> <title>MyNiceApp Version 1.5.5</title> <description>http://example.com/release155.html</description> <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate> <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg" length="371494" type="application/octet-stream"/> </item> </channel> </rss> 17 2009 12 19
  • 21. <?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"> <channel> <title>MyNiceApp Appcast</title> Sparkle <link>http://example.com/appcast.xml</link> <description>MyNiceApp Releases</description> <language>en</language> <item> <title>MyNiceApp Version 1.5.5</title> <description>http://example.com/release155.html</description> <pubDate>Sat, 19 May 2007 15:00:00 +0000</pubDate> <enclosure url="http://example.com/files/myniceapp_1.5.5.dmg" length="371494" type="application/octet-stream"/> </item> </channel> </rss> URL 17 2009 12 19
  • 22. 2009 12 19
  • 23. A.appcast B. i. Sparkle ii. Nib iii.Info.plist 19 2009 12 19
  • 24. 20 2009 12 19
  • 25. SUUpdater 21 2009 12 19
  • 26. SUUpdater checkForUpdate: 22 2009 12 19
  • 27. SUFeedURL ( ) ( )appcast URL SUCheckAtStartup ( ) SUScheduledCheckInterval ( ) SUShowReleaseNote ( ) UserDafaults 23 2009 12 19
  • 28. 2009 12 19
  • 29. sparkle:releaseNotesLink ‣ URL 25 2009 12 19
  • 30. sparkle:md5sum enclosure <enclosure sparkle:md5Sum=”8659fdec0f64edf04ec4fd8756b819eb" url="http://example.org/MyNiceApp_Orange.zip" length="12345" type="application/octet-stream"/> 26 2009 12 19
  • 31. Info.plist ‣ SUPublicDSAKey → ‣ SUExpectsDSASignature → YES ‣ enclosure sparkle:dsaSignature 27 2009 12 19
  • 32. sparkle:version ‣ <enclosure sparkle:version="1.5.5" url="http://example.org/MyNiceApp_Orange.zip" length="12345" type="application/octet-stream"/> 28 2009 12 19
  • 33. ‣ .lproj/InfoPlist.strings SUFeedURLKey URL 29 2009 12 19
  • 34. ‣ DSA 30 2009 12 19
  • 35. 2009 12 19
  • 36. 1. URL Appcasting 2. 3. 4. − 5. 32 2009 12 19
  • 37. 1. URL Appcasting 2. 3. 4. − 5. 32 2009 12 19
  • 38. SUUtilities.[hm] 3 SUStandardVersionComparison() -2 SUSplitVersionString() - SUGetCharType() - / / 33 2009 12 19
  • 40. int SUGetCharType(NSString *character) { if ([character isEqualToString:@"."]) { return kPeriodType; } else if ([character isEqualToString:@"0"] || [character intValue] != 0) { return kNumberType; } else { return kStringType; } } 35 2009 12 19
  • 41. int SUGetCharType(NSString *character) { if ([character isEqualToString:@"."]) { return kPeriodType; } else if ([character isEqualToString:@"0"] || [character intValue] != 0) { return kNumberType; } else { return kStringType; } } 35 2009 12 19
  • 42. “1.23.4a”→ {1,23,4,”a”} “1.23.5.2”→{1,23,5, 2} • • > • 36 2009 12 19
  • 43. “1.23.4a”→ {1,23,4,”a”} “1.23.5.2”→{1,23,5, 2} • • > • 36 2009 12 19
  • 44. “1.23.4a”→ {1,23,4,”a”} “1.23.5.2”→{1,23,5, 2} • • > • 36 2009 12 19
  • 45. “1.23.4a”→ {1,23,4,”a”} “1.23.5.2”→{1,23,5, 2} • ↑ • > • 36 2009 12 19
  • 46. “1.23.4a”→ {1,23,4,”a”} “1.23.5.2”→{1,23,5, 2} • ↑ • > • 36 2009 12 19
  • 47. 1. 2. 3. .app 4. 3. 5. bash 37 2009 12 19
  • 48. 1. 2. 3. .app 4. 3. 5. bash 37 2009 12 19
  • 49. 1. 2. 3. .app 4. 3. 5. bash 37 2009 12 19
  • 50. NSTemporaryDirectory() + [NSProcessInfo globallyUniqueString] • ”.txt” - (void)[SUUpdater beginDownload] - (IBAction)[SUUpdater installAndRestart:] 38 2009 12 19
  • 51. .tar → tar -xC • .tgz → tar -zXC • .zip → ditto -x -k • .tbz → tar -jxC • .dmg → hdiutil ... -(void)[SUUnarchiver extractUpdate] 39 2009 12 19
  • 52. .tar → tar -xC • .tgz → tar -zXC • .zip → ditto -x -k • .tbz → tar -jxC • .dmg → hdiutil ... -(void)[SUUnarchiver extractUpdate] 39 2009 12 19
  • 53. -[NSFileManager enumeratorAtPath:] • Applications - (IBAction)[SUUpdater installAndRestart:] 40 2009 12 19
  • 54. -[NSFileManager movePathWithAuthentication:toPath:] • - (IBAction)[SUUpdater installAndRestart:] 41 2009 12 19
  • 55. setenv("LAUNCH_PATH", [currentAppPath UTF8String], 1); setenv("TEMP_FOLDER", [[downloadPath stringByDeletingLastPathComponent] UTF8String], 1); system("/bin/bash -c '{ for (( i = 0; i < 3000 && “ ”$(echo $(/bin/ps -xp $PPID|/usr/bin/wc -l))-1; i++ )); don" " /bin/sleep .2;n" " donen" " if [[ $(/bin/ps -xp $PPID|/usr/bin/wc -l) -ne 2 ]]; thenn" " /usr/bin/open "${LAUNCH_PATH}"n" " fin" " rm -rf "${TEMP_FOLDER}"n" "} &>/dev/null &'"); [NSApp terminate:self]; - (IBAction)[SUUpdater installAndRestart:] 42 2009 12 19
  • 56. setenv("LAUNCH_PATH", [currentAppPath UTF8String], 1); setenv("TEMP_FOLDER", [[downloadPath stringByDeletingLastPathComponent] UTF8String], 1); system("/bin/bash -c '{ for (( i = 0; i < 3000 && “ ”$(echo $(/bin/ps -xp $PPID|/usr/bin/wc -l))-1; i++ )); don" " /bin/sleep .2;n" " donen" " if [[ $(/bin/ps -xp $PPID|/usr/bin/wc -l) -ne 2 ]]; thenn" " /usr/bin/open "${LAUNCH_PATH}"n" " fin" " rm -rf "${TEMP_FOLDER}"n" "} &>/dev/null &'"); [NSApp terminate:self]; bash open - (IBAction)[SUUpdater installAndRestart:] 42 2009 12 19
  • 57. Sparkle Appcasting ‣ ‣ ‣ 43 2009 12 19
  • 58. 2009 12 19
  • 59. 2009 12 19
  • 60. ‣ 46 2009 12 19
  • 61. dmg ‣ jp.i.nifty.kimuraw.SparkleSample.plist 47 2009 12 19